반응형
문제
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
예제 입력 1
ACAYKP
CAPCAK
예제 출력 1
4
풀이
LCS알고리즘을 그대로 적용하기만 하면 끝나는 문제이다.
ACAYKP
CAPCAK
위의 두 문자열을 비교하는 경우 lcs를 적용하여 lcs table을 나타내면 아래와 같이 된다.
0 | C | A | P | C | A | K | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
A | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
C | 0 | 1 | 1 | 1 | 2 | 2 | 2 |
A | 0 | 1 | 2 | 2 | 2 | 3 | 3 |
Y | 0 | 1 | 2 | 2 | 2 | 3 | 3 |
K | 0 | 1 | 2 | 2 | 2 | 3 | 4 |
P | 0 | 1 | 2 | 3 | 3 | 3 | 4 |
LCS알고리즘에 대해서 간단하게 말하자면
서로 같은 문자일 경우에는 table의 왼쪽 위의 값에 1을 더한 값이된다.
서로 다른 문자일 경우에는 table의 왼쪽 값과 위쪽 값 중 더 큰 값을 취하게 된다.
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char input1[1000];
char input2[1000];
int lcs[1001][1001];
int Max(int a, int b) {
if(a>b)
return a;
else
return b;
}
int main(void){
int len1, len2;
scanf("%s", input1);
scanf("%s", input2);
len1 = strlen(input1);
len2 = strlen(input2);
for(int i=0; i<len1; i++){
for(int j=0; j<len2; j++){
if(input1[i] == input2[j]){
lcs[i+1][j+1] = lcs[i][j] + 1;
}
else{
lcs[i+1][j+1] = Max(lcs[i][j+1], lcs[i+1][j]);
}
}
}
printf("%d\n", lcs[len1][len2]);
}
728x90
반응형
'알고리즘 > PS - 백준' 카테고리의 다른 글
[백준 1449 - C++] 수리공 항승 : 그리디 알고리즘 (0) | 2021.03.25 |
---|---|
[백준 1520 - C++] 내리막 길 : DFS & 다이나믹 프로그래밍 (DP) (0) | 2021.02.19 |
[백준 11057 - C++] 오르막 수 : 다이나믹 프로그래밍 (DP) (0) | 2021.02.19 |
[백준 10844 - C++] 쉬운 계단 수 : 다이나믹 프로그래밍 (DP) (0) | 2021.02.19 |
[백준 12865 - C++] 평범한 배낭 : 다이나믹 프로그래밍 (DP) (0) | 2021.02.19 |