最长公共子序列

题目描述:

字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj。
例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。
给定两个字符串,求他们的最长公共子序列。

 

输入:

输入两行,每行输入一个字符串,只包括小写字母。

 

输出:

输出最长公共子序列长度。

 

样例输入:

abcfbc
abfcab

 

样例输出:

4

最长公共子串和最长公共子序列的区别为:子串是串的一个连续部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新的序列;也就是说。子串中字符的位置必须是连续的,子序列则可以不必连续。
代码来喽:

   #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    using namespace std;
    char s1[1005],s2[1005];
    int dp[1005][1005];
    int main()
    {
    while(scanf("%s%s",s1+1,s2+1)!=EOF)
    {
        int n=strlen(s1+1),m=strlen(s2+1);
        dp[0][0];
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(s1[i]==s2[j])
            dp[i][j]=dp[i-1][j-1]+1;
            else
            dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
        }
        printf("%d\n",dp[n][m]);
    }
    return 0;
    } 

 

posted @ 2017-12-19 19:42  Zhoier  阅读(159)  评论(0编辑  收藏  举报