求最长公共子序列

来源:互联网 发布:羊毛刷批发淘宝网 编辑:程序博客网 时间:2024/05/29 05:56

求最长公共子序列


Description

字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。
令给定的字符序列 X=x0x1xm1,序列 Y=y0y1yk1X 的子序列,存在 X 的一个严格递增下标序列 <i0i1ik1>,使得对所有的 j=01k1,有 xij=yj
例如,X=ABCBDABY=BCDBX 的一个子序列。
对给定的两个字符序列,求出他们最长的公共子序列。


Input

1 行为第 1 个字符序列,都是大写字母组成,以”.”结束。长度小于 5000
2 行为第 2 个字符序列,都是大写字母组成,以”.”结束,长度小于 5000


Output

输出上述两个最长公共子序列的长度。


Sample Input

ABCBDAB.
BACBBD.


Sample Output

4


Solution

fi,j 表示 xi 个字符与 yj 个字符的最长公共子序列的长度,则
xi1=yj1

fi,j=fi1,j1+1

xi1yj1
fi,j=MAX{fi1,j,fi,j1}


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;}
0 0
原创粉丝点击