반응형
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 |
댓글