[๋ฐฑ์ค(BOJ] 11054๋ฒ: ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด (Dynamic Programming, C++)
DP[i]: i๋ฒ์งธ์์ ์ฆ๊ฐํ๋ ๊ฐ์ฅ ํฐ ๋ถ๋ถ์์ด
DP2[i] : ๋งจ ๋ค์์๋ถํฐ ํ์ํ์ ๋, i๋ฒ์งธ์์ ๊ฐ์ฅ ํฐ ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด
i๋ฒ์งธ ๊ธฐ์ค์ผ๋ก DP[i]์ DP2[i]์ ํฉ์ด ๊ฐ์ฅ ํฌ๋ค๋ฉด, i๋ฒ์งธ ๊ธฐ์ค ์ด์ ์ผ๋ก ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด๊ณผ, ๋งจ ๋ค ๊ธฐ์ค์ผ๋ก i๋ฒ์งธ๊น์ง ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ ํฉํ์ ๋ ๊ทธ ์๊ฐ ๊ฐ์ฅ ํฐ ๊ฒ์ด๋ค.
์ด๋ DP[i]์ DP2[i]์๋ i๋ฒ์งธ๊ฐ ๊ฐ๊ฐ ํฌํจ๋์ด ํฉํ๊ฒ ๋๋ฉด i๋ฒ์งธ๋ฅผ 2๋ฒ ์นด์ดํ ํ ๊ฒ์ด ๋๊ธฐ ๋๋ฌธ์ DP[i] + DP2[i] - 1๋ก ๋ต์ ๊ตฌํ๋ค.
#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
int N;
scanf("%d", &N);
int S[N] = {}; int DP[N] = {}; int DP2[N] = {};
for(int i=0; i<N; i++) scanf("%d", &S[i]);
for(int i=0; i<N; i++){
DP[i] = 1;
for(int j=0; j<i; j++){
if(S[i] > S[j]) DP[i] = max(DP[i], DP[j]+1);
}
}
for(int i=N-1; i>=0; i--){
DP2[i] = 1;
for(int j=N-1; j>i; j--){
if(S[i] > S[j]) DP2[i] = max(DP2[i], DP2[j]+1);
}
}
int result=1;
for(int i=0; i<N; i++){
result = max(result, DP[i] + DP2[i]-1);
}
printf("%d", result);
}