#include <iostream> #include <string.h> #include <algorithm> using namespace std; int N; int Max; int arr[1010]; int dp1[1010]; int dp2[1010]; // 증가수열 int solve1(int cnt) { if(dp1[cnt] != 0) { return dp1[cnt]; } dp1[cnt] = 1; for(int i = cnt-1; i >= 1; i--) { if(arr[i] < arr[cnt]) { dp1[cnt] = max(dp1[cnt], solve1(i) + 1); } } return dp1[cnt]; } // 감소수열 int solve2(int cnt) { if(dp2[cnt] != 0) { return dp2[cnt]; } dp2[cnt] = 1; for(int i = cnt+1; i <= N; i++) { if(arr[i] < arr[cnt]) { dp2[cnt] = max(dp2[cnt], solve2(i) + 1); } } return dp2[cnt]; } int main(void) { // freopen("B11054_input.txt", "r", stdin); cin >> N; for(int i = 1; i <= N; i++) { cin >> arr[i]; } for(int i = N; i >= 1; i--) { solve1(i); } for(int i = 0; i <= N; i++) { solve2(i); } for(int i = 1; i <= N; i++) { if(Max < dp1[i] + dp2[i]) { Max = dp1[i] + dp2[i]; } } cout << Max-1; return 0; } | cs |
'Baekjoon > DP' 카테고리의 다른 글
[백준 2579] 계단 오르기 (DP) (C/C++) (0) | 2020.01.18 |
---|---|
[백준 1912] 연속합 (DP) (C/C++) (★) (0) | 2020.01.18 |
[백준 11722] 가장 긴 감소하는 부분 수열 (DP) (C/C++) (★★) (0) | 2020.01.17 |
[백준 11055] 가장 큰 증가 부분 수열 (DP) (C/C++) (★★) (0) | 2020.01.17 |
[백준 11053] 가장 긴 증가하는 부분 수열 (DP) (C/C++) (★★) (0) | 2020.01.17 |