본문 바로가기
백준 문제 풀이

[백준 14003] 가장 긴 증가하는 부분 수열 5

by $# 2020. 4. 2.

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


해설

이번 문제는 LIS의 끝판왕 가장 긴 증가하는 수열 5 문제이다.

역시 쉽지 않았다.

https://far-simple.tistory.com/43

전에 썼던 이 방법을 사용했다.

 

 

˙˙˙

 

소스코드

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, arr[1000001], p[1000001], cnt;
vector<int> ans, print;
int main(){
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> arr[i];
	ans.push_back(arr[1]);
	for (int i = 2; i <= n; i++) {
		if (ans[cnt] < arr[i]) {
			ans.push_back(arr[i]);
			cnt++;
			p[i] = cnt;
		}
		else {
			int pos = lower_bound(ans.begin(), ans.end(), arr[i]) - ans.begin();
			ans[pos] = arr[i];
			p[i] = pos;
		}
	}
	cout << cnt + 1 << '\n';
	for(int i=n; i>=1 && cnt >=0; i--){
		if (p[i] == cnt) {
			print.push_back(arr[i]);
			cnt--;
		}
	}
	for (int i = print.size() - 1; i >= 0; i--)
		cout << print[i] << ' ';
}

'백준 문제 풀이' 카테고리의 다른 글

[백준 9998] 블록 쌓기  (0) 2020.04.22
[백준 2568] 전깃줄 - 2  (0) 2020.04.02
[백준 12015] 가장 긴 증가하는 부분 수열 2  (0) 2020.04.02
[백준 2565] 전깃줄  (0) 2020.04.01
[백준 5397] 키로거  (0) 2020.03.31

댓글