private K 2021. 9. 25. 22:45

LIS 4 14002

 

풀이코드

#include <iostream>
#include <vector>

using namespace std;
// 11053 가장 긴 증가하는 부분 수열

int n;
int A[1001];

int cache[1001];

int V[1001];

int max(int a, int b){ return a > b ? a : b; }

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr); 
	cout.tie(nullptr); 
	
    cin >> n;
    
    for(int i = 1; i <= n; i++){
        cin >> A[i];
    }
    
    fill_n(cache, 1001, 1);
	fill_n(V, 1001, 0);
	

	
	for(int i = 2; i <= n; i++){
	    for(int j = i - 1; j >= 1; j--){
	        if(A[j] < A[i]){
	            if(cache[i] < cache[j] + 1){
	                cache[i] = cache[j] + 1;
	                V[i] = j;
	            }
	        }
	    }
	}
	
	int ans = -1;
	int maxIdx = 0;
	
	for(int i = 1; i <= n; i++){
	    if(cache[i] > ans){
	        ans = cache[i];
	        maxIdx = i;
	    }
	}
	
	cout << ans << '\n';
	
	int idx = maxIdx;
	
	vector<int> vec;
	
	while(idx != 0){
	    vec.push_back(A[idx]);
	    idx = V[idx];
	}
	
	for(int i = ans - 1; i >= 0; i--) cout << vec[i] << ' ';
	
	cout << '\n';
	
	
}

 

해설


적용한 레시피 / 방법론 + 접근법

1

풀이

0. 이전 문제 11053 번

를 구현하고, 거기에

1. V[i] 를 추가한다.

아쉬웠던 부분 / 오답 원인 / 개선해야 할 점

 

반응형