문제 링크입니다: https://www.acmicpc.net/problem/14002
가장 긴 증가하는 부분 수열 5(https://jaimemin.tistory.com/1095)와 동일한 문제였습니다.
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
const int MAX = 1000 + 1;
int N;
int arr[MAX];
int cache[MAX];
pair<int, int> answer[MAX];
stack<int> s;
int LIS(void)
{
int idx = 0;
cache[idx] = arr[0];
answer[0] = { 0, arr[0] };
for (int i = 1; i < N; i++)
{
if (cache[idx] < arr[i])
{
cache[++idx] = arr[i];
//lis가 될 수 있는 위치 정보를 first에 담고
//실제 그 값을 second에 담아준다.
answer[i] = { idx, arr[i] };
}
else
{
int idx2 = lower_bound(cache, cache + idx, arr[i]) - cache;
cache[idx2] = arr[i];
answer[i] = { idx2, arr[i] };
}
}
return idx + 1;
}
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 0; i < N; i++)
cin >> arr[i];
int result = LIS();
cout << result << "\n";
int num = result - 1;
for (int i = N - 1; i >= 0; i--)
if (answer[i].first == num)
{
s.push(answer[i].second);
num--;
}
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
cout << "\n";
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 11058번 크리보드 (2) | 2019.01.25 |
---|---|
백준 2568번 전깃줄-2 (0) | 2019.01.24 |
백준 14003번 가장 긴 증가하는 부분 수열 5 (2) | 2019.01.24 |
백준 2565번 전깃줄 (0) | 2019.01.24 |
백준 5015번 ls (0) | 2019.01.24 |