티스토리 뷰

D[i] : a[i]를 마지막에 포함하는 가장 긴 증가하는 부분 수열의 길이

d[i] : a[i]를 시작으로 포함하는 가장 긴 감소하는 부분 수열의 길이


정답 : max(D[i]+d[i]-1), 1<=i<=n


#include <iostream>


using namespace std;


int D[1001];

int d[1001];

int a[1001];


int main(void) {

int n;

cin >> n;

for (int i = 1; i <= n; i++) {

cin >> a[i];

}

/*

D[i] : a[i]를 마지막에 포함하는 가장 긴 증가하는 부분 수열의 길이

d[i] : a[i]를 시작으로 포함하는 가장 긴 감소하는 부분 수열의 길이

정답 : max(D[i] + d[i] - 1), 1 <= i <= n

*/

// D[i] 구하기

for (int i = 1; i <= n; i++) {

D[i] = 1;

for (int j = 1; j < i; j++) {

if (a[j] < a[i] && D[i] < D[j] + 1) {

D[i] = D[j] + 1;

}

}

}


// d[i] 구하기

for (int i = n; i >= 1; i--) {

d[i] = 1;

for (int j = i + 1; j <= n; j++) {

if (a[j] < a[i] && d[i] < d[j] + 1) {

d[i] = d[j] + 1;

}

}

}


int max = 0;

for (int i = 1; i <= n; i++) {

if (max < D[i] + d[i] -1) {

max = D[i] + d[i] - 1;

}

}

cout << max << endl;

return 0;

}

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함