#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n, mx;
cin >> n;
int arr[n];
int dp[n];
int dp2[n];
for (int i = 0; i < n; i++)
{
dp[i] = 1;
dp2[i] = 1;
}
for (int i = 0; i < n; i++)
cin >> arr[i];
for (int i = n - 2; i >= 0; i--)
for (int j = i + 1; j < n; j++)
if (arr[i] > arr[j])
dp[i] = max(dp[i], dp[j] + 1);
for (int i = 1; i < n; i++)
for (int j = i - 1; j >= 0; j--)
if (arr[i] > arr[j])
dp2[i] = max(dp2[i], dp2[j] + 1);
for (int i = 0; i < n; i++)
dp[i] = dp[i] + dp2[i] - 1;
mx = 0;
for (int i = 0; i < n; i++)
mx = max(mx, dp[i]);
cout << mx;
return (0);
}
이전 포스팅인 가장 긴 증가/감소 하는 수열을 잘 이해했다면, 바로 풀 수 있는 문제였습니다.
문제를 보자마자 이렇게 해결하면 되겠구나 하고 5분만에 작성했습니다.
dp문제를 단순하게 점화식만 찾고 해결하는 방식이 아닌 2가지 경우로 분리 후 다시 합치는 문제도 있다는걸 배운 문제였습니다.