본문 바로가기
Algorithm/DP

LCS 2

by KurkurJae 2021. 4. 8.
반응형

 

 

www.acmicpc.net/problem/9252

 

9252번: LCS 2

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

www.acmicpc.net

문제

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.

예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

입력

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.

출력

첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를, 둘째 줄에 LCS를 출력한다.

LCS가 여러 가지인 경우에는 아무거나 출력하고, LCS의 길이가 0인 경우에는 둘째 줄을 출력하지 않는다.

 

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string input_one;
string input_two;
string ans;
int DP[1001][1001];
int main(){

    ios_base :: sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> input_one >> input_two;
    for(int i = 1 ; i<= input_one.size(); i++){
        for(int j = 1; j<= input_two.size(); j++ ){
            if(input_one[i-1] == input_two[j-1]){
                DP[i][j] = DP[i-1][j-1] +1; 
            }
            else{
                DP[i][j] = max(DP[i - 1][j], DP[i][j - 1]);
            }
        }
    }

    int size = DP[input_one.size()][input_two.size()];
    int i = input_one.size();
    int j = input_two.size();
    
    while (i >= 1 && j >= 1){
        if(DP[i][j] == DP[i-1][j]){
			i--;
		}else if(DP[i][j] == DP[i][j-1]){
			j--;
		}else{
			ans += input_one[i-1];	
			i--; j--;
		}
    }
    reverse(ans.begin(), ans.end());
    cout << size <<endl;
    cout << ans ;
    return 0;
}

 

 

 

 

반응형

'Algorithm > DP' 카테고리의 다른 글

백준 앱  (0) 2021.04.15
백준 평범한배낭  (0) 2021.04.15
DP 연습 내려가기  (0) 2021.03.09
DP연습 계단 오르기  (0) 2020.12.03
DP연습 타일채우기  (0) 2020.12.03

댓글