문제
풀이
- 바이토닉 부분 수열의 가운데 값을 찾는 것으로 생각하는게 쉽다.
- 수열의 앞에서부터 탐색하여 증가하는 값을 cache로 두고, 마찬가지로 뒤에서 부터 탐색하여 증가하는 값을 cache_reverse로 둔다.
- cache와 cache_reverse의 합이 최대가 되는 인덱스를 찾는다.
코드
#include <iostream>
using namespace std;
int main()
{
int N;
int A[1001];
cin >> N;
for (int i = 1; i <= N; ++i)
{
cin >> A[i];
}
if (N == 1)
{
cout << "1";
return 0;
}
int cache[1001];
int cache_reverse[1001];
// 증가하는 부분 수열
for (int i = 1; i <= N; ++i)
{
cache[i] = 1;
int maxi = 0;
for (int j = 1; j <= i; ++j)
{
if (A[i] > A[j])
{
maxi = max(maxi, cache[j]);
}
}
cache[i] = maxi + 1;
}
// 뒤에서 부터 탐색하여 증가하는 부분 수열
for (int i = N; i >= 1; --i)
{
cache_reverse[i] = 1;
int maxi = 0;
for (int j = N; j >= i; --j)
{
if (A[i] > A[j])
{
maxi = max(maxi, cache_reverse[j]);
}
}
cache_reverse[i] = maxi + 1;
}
// 가장 긴 바이토닉의 부분 수열의 가운데 값을 찾는 과정
int answer = 0;
for (int i = 1; i <= N; ++i)
{
answer = max(answer, cache[i] + cache_reverse[i] - 1);
}
cout << answer;
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 14938: 서강그라운드 (0) | 2023.09.30 |
---|---|
[백준][C++] 12851: 숨바꼭질 2 (0) | 2023.09.29 |
[백준][C++] 10830: 행렬 제곱 (0) | 2023.09.27 |
[백준][C++] 9935: 문자열 폭발 (0) | 2023.09.26 |
[백준][C++] 1987: 알파벳 (0) | 2023.09.25 |