728x90
문제
https://www.acmicpc.net/problem/11722
문제 해결
1. 가장 긴 증가하는 부분 수열과 비슷하게 현재 자기 자신의 길이를 dp [i]에 저장했다.
2. A = {10, 30, 10, 20, 20, 10}인 경우에서 가장 긴 감소하는 부분 수열은 30, 20 , 10이다.
3. 처음 10은 뒤에 숫자가 없으므로 자동으로 dp[0] = 1이다.
4. 그다음 30은 자기 뒤로부터 숫자가 자기 자신(30) 보다 크면 dp[i],dp[j] 를 비교한다.
5. 이 방법을 끝까지 반복한다.
코드
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
|
#include <iostream>
using namespace std;
int main(void){
int dp[1001];
int ary[1001];
int N,Max = -1;
cin >> N;
for(int i = 0;i<N;i++){
cin >> ary[i];
}
dp[0] = 1;
int temp = 0;
for(int i = 1;i<N;i++){
for(int j = i;j>-1;j--){
if(ary[i]<ary[j]){
if(dp[j]>temp){
dp[i] = dp[j]+1;
temp = dp[j];
Max = max(Max,dp[i]);
}
}
}
if(temp == 0){dp[i] = 1;}
temp = 0;
}
cout << Max;
}
|
cs |
728x90
'다이나믹 프로그래밍' 카테고리의 다른 글
[백준/C++][평범한 배낭(12865번)] (0) | 2020.12.15 |
---|---|
[백준/C++][점프 점프(11060번)] (0) | 2020.12.14 |
[C++/알고리즘][다이나믹 프로그래밍(동적계획법)-DP] (2) | 2020.12.09 |
[백준/C++][퇴사(14501번)] (0) | 2020.12.03 |
[백준/C++][가장 긴 증가하는 부분 수열(11053번)] (0) | 2020.12.03 |