본문 바로가기

Algorithm_BOJ(백준)/동적프로그래밍(DP)

[백준 11053 c++ VOOO] 가장 긴 증가하는 부분 수열

728x90
반응형

- 풀이 링크:

https://github.com/xhaktmchl/Algorithm_study/blob/main/BOJ/%EB%8F%99%EC%A0%81%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D(DP)/%5B%EB%B0%B1%EC%A4%80%2011053%20c%2B%2B%20VOOO%5D%20%EA%B0%80%EC%9E%A5%20%EA%B8%B4%20%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94%20%EB%B6%80%EB%B6%84%20%EC%88%98%EC%97%B4.cpp 

 

GitHub - xhaktmchl/Algorithm_study: 알고리즘 이론 및 문제풀이

알고리즘 이론 및 문제풀이. Contribute to xhaktmchl/Algorithm_study development by creating an account on GitHub.

github.com

#include <iostream>
#include <algorithm>
//#include <map> // 중복 x 
//#include <string> // getline
//#include <cstring> // memset
//#include <vector>
//#include <queue>
//#include <set> // 트리, 중복 x
//#include <unordered_set>
using namespace std;
/*
[백준 11053 c++ VOOO] 가장 긴 증가하는 부분 수열
접근: DP
dp[i]: i번재 숫자까지의 최장 증가 수열의 길이
dp[i] = max(dp[0] ... dp[i-1])+1
p[i]: i번째 숫자까지의 최장증가수열 바로 전 인덱스
시간복잡도: n*n
풀이:
    //1.입력
    //초기화
    //2.dp[i]: i번재 숫자까지의 최장 증가 수열의 길이
    //dp[i] = max(dp[0] ... dp[i - 1]) + 1
    //p[i]: i번째 숫자까지의 최장증가수열 바로 전 인덱스
    //3.출력: LIS 길이
*/
int n;
int a[1000000 + 10];
int p[1000000 + 10];
int dp[1000000 + 10];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(0);

    //1.입력
    //초기화
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        p[i] = -1;
    }
    //2.dp[i]: i번재 숫자까지의 최장 증가 수열의 길이
    //dp[i] = max(dp[0] ... dp[i - 1]) + 1
    //p[i]: i번째 숫자까지의 최장증가수열 바로 전 인덱스
    for (int i = 1; i <= n; i++) {

        for (int j = 1; j < i; j++) {
            if (a[i] > a[j] && dp[j] > dp[i]) {
                dp[i] = dp[j];
                p[i] = j;
            }
        }
        dp[i] += 1; // 현재 구간 길이
    }
    //3.출력: LIS 길이
    cout << *max_element(dp, dp + n + 1) << '\n';
    return 0;
}
반응형