求最长公共子序列

求最长公共子序列


Description

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


Input

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


Output

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


Sample Input

ABCBDAB.
BACBBD.


Sample Output

4


Solution

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

fi,j=fi1,j1+1

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


Code

#include 
#include 
#include 

#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;ifor(int j=0;jif(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;
}

你可能感兴趣的:(题解,Dp)