Coding Is My Life

코딩은 인생

다이나믹 프로그래밍

[백준/C++][가장 긴 증가하는 부분 수열(11053번)]

산기대 컴공 2020. 12. 3. 20:18
728x90

문제

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

 

11053번: 가장 긴 증가하는 부분 수열

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

www.acmicpc.net

이 문제는 나도 다른 사람의 풀이를 보고 알았다. 다이나믹 프로그래밍은 너무 어려운듯하다.

 

문제해결

1. 10,20,10,30,20,50 이 수열A로 있으면 맨 처음 인덱스인 10의 대한 dp[0] = 1(길이) dp[1] = 2 dp[2] = 1 이런식으로 한다.

2. 처음 인덱스부터 자기자신 전까지 탐색를 한다.

3. 만약 자기자신보다 작은 숫자이면 현재자신의 dp의 값과 작은 숫자의 dp의 값을 비교해서 더 큰 값이 현재 자기자신의 dp값이된다.

 

코드 

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
31
32
33
34
35
#include <iostream>
using namespace std;
int ary[1001];
int dp[1001];
int N;
int max(int a,int b){
    if(a>=b){return a;}
    else{return b;}
}
void set(void){
    for(int i = 0;i<N;i++){dp[i] = 1;}
}
int main(void)
{
    int temp = -1;
    int result = 1;
    cin >> N;
    for(int i = 0;i<N;i++){
        cin >> ary[i];
    }
    set();
    for(int i = 0;i<N;i++){
        temp = -1;
        for(int j = 0;j<i;j++){
            if(ary[i]>ary[j]){
                if(dp[j]>=dp[i]){
                temp = ary[j];
                dp[i] = dp[j]+1;
                }
            }
        }
        result = max(result,dp[i]);
    }
    cout << result;
}
cs
728x90