알고리즘/algospot

최대 부분 수열 직접 구하기(LIS)

꾸준함. 2018. 1. 31. 11:00

http://jaimemin.tistory.com/317?category=985009에서는 LIS의 길이만 구했는데 이번에는 직접 최대 부분 수열까지 구해보는 코드입니다.


/*

최대 증가 부분 수열을 실제로 계산하기

*/

#include <iostream>

#include <vector>

#include <algorithm>

#include <cstring> //memset

using namespace std;

 

int length; //수열 길이

int cache[101], S[100], choices[101];

//S[start]에서 시작하는 증가 부분 수열 중 최대 길이 반환

int LIS(int start)

{

        int &result = cache[start + 1];

        if (result != -1)

               return result;

        result = 0;

        int bestNext = -1;

        for (int next = start + 1; next < length; next++)

               if (start == -1 || S[start] < S[next]) //처음 index이거나 전보다 더 클 경우에만

               {

                       int candidate = LIS(next) + 1;

                       if (candidate > result)

                       {

                              result = candidate;

                              bestNext = next;

                       }

               }

        choices[start + 1] = bestNext;

        return result;

}

 

//S[start]에서 시작하는 LIS seq에 저장

void reconstruct(int start, vector<int> &seq)

{

        if (start != -1)

               seq.push_back(S[start]);

        int next = choices[start + 1];

        if (next != -1)

               reconstruct(next, seq);

}

 

int main(void)

{

        cout << "수열의 길이: ";

        cin >> length;

       

        cout << "수열 입력" << endl;

        for (int i = 0; i < length; i++)

               cin >> S[i];

        memset(cache, -1, sizeof(cache));

        memset(choices, -1, sizeof(choices));

        cout << "최대 증가 부분 수열의 길이: " << LIS(-1) << endl;

        vector<int> seq;

        reconstruct(-1, seq);

        cout << "최대 증가 부분 수열: ";

        for (int i = 0; i < seq.size(); i++)

               cout << seq[i] << " ";

        cout << endl;

        return 0;

}

개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 프로그래밍 대회에서 배우는 알고리즘 문제해결전략

반응형

'알고리즘 > algospot' 카테고리의 다른 글

algospot OCR  (1) 2018.02.01
algospot PACKING  (0) 2018.02.01
algospot NUMB3RS  (0) 2018.01.29
algospot POLY  (0) 2018.01.28
algospot ASYMTILING  (0) 2018.01.28