알고리즘 문제 해결/BOJ

[LIS, DP] BOJ 11053 가장 긴 증가하는 부분 수열 (C++)

jmkimmessi 2022. 6. 13. 15:13
반응형

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

 

문제 해결 알고리즘

 

다이나믹 프로그래밍을 이용해 푼 LIS알고리즘

 

https://kimmessi.tistory.com/191?category=871925 

 

[알고리즘] 최장 증가 부분 수열(LIS) - DP, 이분 탐색, LIS 출력

최장 증가 부분 수열 (LIS)이란? 어떤 수열에서 수열의 일부 원소를 골라 만든 부분 수열 중, 각 원소가 이전 원소보다 크다는 조건을 만족하고, 그 길이가 최대인 수열을 최장 증가 부분 수열이라

kimmessi.tistory.com

 

자세한 내용은 위의 링크를 참고

소스 코드

 

#include <bits/stdc++.h>
using namespace std;

int main(){
    int num; cin >> num;
    vector<int> v(num);
    vector<int> dp(num);
    int result = 1;
    for(int i=0;i<num;i++) cin >> v[i];

    dp[0] = 1;

    for(int i=1;i<num;i++){
        dp[i] = 1;
         for(int j=0;j<i;j++){    
            if(v[i] > v[j] && dp[j] + 1 > dp[i]) dp[i] = dp[j] + 1;
        }
        result = max(result, dp[i]);
    }

    cout << result;
}

 

반응형