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] 를 추가한다.
아쉬웠던 부분 / 오답 원인 / 개선해야 할 점
반응형
'ps > 다이나믹 프로그래밍' 카테고리의 다른 글
[dp] 15988 1,2,3 더하기 3 (0) | 2021.09.26 |
---|---|
[dp] 1912 연속합 (0) | 2021.09.25 |
[dp] 11053 LIS 가장 긴 증가하는 부분 수열 (0) | 2021.09.25 |
1,2,3 더하기 5 (15990) (0) | 2021.09.24 |
카드 구매하기 11052 (0) | 2021.09.24 |