Coding Is My Life

코딩은 인생

다이나믹 프로그래밍

[백준/C++][가장 긴 감소하는 부분 수열(11722번)]

산기대 컴공 2020. 12. 14. 18:58
728x90

문제

https://www.acmicpc.net/problem/11722

 

11722번: 가장 긴 감소하는 부분 수열

수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} 

www.acmicpc.net

문제 해결

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