求最长公共子序列
Description
字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。
令给定的字符序列
X=“x0,x1,…,xm−1”
,序列
Y=“y0,y1,…,yk−1”
是
X
的子序列,存在
例如,
X=“ABCBDAB”
,
Y=“BCDB”
是
X
的一个子序列。
对给定的两个字符序列,求出他们最长的公共子序列。
Input
第
第
2
行为第
Output
输出上述两个最长公共子序列的长度。
Sample Input
ABCBDAB.
BACBBD.
Sample Output
4
Solution
设
fi,j
表示
x
前
若
xi−1=yj−1
若 xi−1≠yj−1
Code
#include <iostream>
#include <cstdio>
#include <cstring>
#define Max(x,y) ((x)>(y)?(x):(y))
using namespace std;
char s1[5010],s2[5010];
int f[5010][5010];
int main(){
freopen("lcs.in","r",stdin);
freopen("lcs.out","w",stdout);
scanf("%s%s",s1,s2);
int l1=strlen(s1)-1,l2=strlen(s2)-1;
for(int i=0;i<l1;i++)
for(int j=0;j<l2;j++)
if(s1[i]==s2[j])
f[i+1][j+1]=f[i][j]+1;
else
f[i+1][j+1]=Max(f[i+1][j],f[i][j+1]);
printf("%d\n",f[l1][l2]);
return 0;
}