알고리즘/BOJ

백준 14002번 가장 긴 증가하는 부분 수열 4

꾸준함. 2019. 1. 24. 20:11

문제 링크입니다: 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