문제
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.
예제 입력 1
ACAYKP CAPCAK |
예제 출력 1
4 |
더보기
Solution
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int max2(int x,int y)
{
return x>y?x:y;
}
int max3(int x,int y,int z)
{
return x>=y&&x>=z?x:y>=x&&y>=z?y:z;
}
int main(void)
{
char A[1001]={'\0', }, B[1001]={'\0', };
int **LCS=NULL, a, b;
scanf("%s%s", A, B);
a=strlen(A);
b=strlen(B);
LCS=(int **)malloc((a+1)*sizeof(int *));
for(int i=0;i<=a;i++)
LCS[i]=(int *)calloc(b+1,sizeof(int));
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++)
if(A[i-1]!=B[j-1])
LCS[i][j]=max2(LCS[i-1][j],LCS[i][j-1]);
else
LCS[i][j]=max3(LCS[i-1][j],LCS[i][j-1],LCS[i-1][j-1]+1);
printf("%d\n", LCS[a][b]);
for(int i=0;i<=a;i++)
free(LCS[i]);
free(LCS);
return 0;
}
728x90
'백준 알고리즘' 카테고리의 다른 글
<백준 알고리즘> 1965번: 상자넣기 (0) | 2021.06.22 |
---|---|
<백준 알고리즘> 11054번: 가장 긴 바이토닉 부분 수열 (0) | 2021.06.21 |
<백준 알고리즘> 1339번: 단어 수학 (0) | 2021.06.07 |
<백준 알고리즘> 17626번: Four Squares (0) | 2021.05.22 |
<백준 알고리즘> 1699번: 제곱수의 합 (0) | 2021.05.22 |