알고리즘 문제/LIS

[개쉬운 풀이] 백준 14002 가장 긴 증가하는 부분 수열 4 (3일차)

odaebum 2024. 11. 24. 21:53
728x90

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

 

문제

 

생각

1. 기본적인 LIS 문제이다. 이를 dp를 활용하여 해결해야한다.

2. 길이만 출력하는 것이 아닌 수열을 출력해야 하므로 vector를 이용하여서 같이 저장 및 업데이트 한다.

 

풀이

#include <iostream>
#include <vector>
using namespace std;

const int MAX = 1001;

int N;
vector<int> v;
int dp[MAX];
vector<int> LIS[MAX];
vector<int> answer;

void input(){
    cin >> N;
    v = vector<int> (N);
    for(int i = 0; i < N; i++){
        cin >> v[i];
    }
}

void sol(){
    for(int i = 0; i < N; i++){
        dp[i] = 1; //초기값
        LIS[i].push_back(v[i]);
        for(int j = 0; j < i; j++){
            if(v[i] > v[j]){
                if(dp[i] < dp[j] + 1){ //길이 비교
                    LIS[i].clear();
                    LIS[i] = LIS[j];
                    LIS[i].push_back(v[i]);
                    dp[i] = dp[j] + 1;
                }
            }
        }
        //최장 수열 판별
        if(answer.size() < LIS[i].size()){
            answer = LIS[i];
        }
    }
}

int main(){
    input();
    sol();
    cout << answer.size() << endl;
    for(int i = 0; i < answer.size(); i++){
        cout << answer[i] << " ";
    }
    return 0;
}
728x90