다이나믹 프로그래밍을 이용하는 문제
base
를 기준으로 가장 긴 증가하는 수열과 감소하는 수열을 찾아야한다.dp1
은 증가하는 수열, dp2
는 감소하는 수열의 길이를 저장한다.i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
수 | 1 | 5 | 2 | 1 | 4 | 3 | 4 | 5 | 2 | 1 |
dp1 | 1 | 2 | 2 | 1 | 3 | 3 | 4 | 5 | 2 | 1 |
dp1
과 dp2
를 가지고 ans
를 구하는데, base
번째 값은 중복되기 때문에 -1
을 해준다.ans
를 정렬해주고 출력한다.#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> v;
for (int i = 0;i < n;i++) {
int tmp;
cin >> tmp;
v.push_back(tmp);
}
vector<int> ans(n);
vector<int> dp1(n,1);
vector<int> dp2(n,1);
for (int base = 0;base < n;base++) { //base를 기준으로
for (int i = 1;i <= base;i++) { //증가 수열
for (int j = 0;j < i;j++) {
if (v[i] > v[j]) {
dp1[i] = max(dp1[j] + 1, dp1[i]);
}
}
}
for (int i = n - 2;i >= base;i--) { //감소 수열
for (int j = n - 1;j > i;j--) {
if (v[i] > v[j]) {
dp2[i] = max(dp2[j] + 1, dp2[i]);
}
}
}
ans[base] = dp1[base] + dp2[base] - 1;
}
sort(ans.begin(), ans.end(), greater<int>());
cout << ans[0];
return 0;
}