2080最长公共子序列问题

来源:互联网 发布:开发java程序的一般步骤 编辑:程序博客网 时间:2024/06/05 19:15

最长公共子序列问题

Time Limit: 1000MS Memory Limit: 65536KB
SubmitStatistic Discuss

Problem Description

 给定两个序列X=

Input

输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。

Output

每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。

Example Input

ABCBDABBDCABA

Example Output

4
最长公共子序列:在两段字符中,任意去掉其中的字符,剩余的不改变原来顺序,并组成新的字符串。
最长公共子序列是指多个字符串可具有的最大长度的公共子序列。
#include<cstdio>#include<cstring>using namespace std;char x[505],y[505];int num[505][505];int flag[505][505];void LCS()//动态规划求解{    int i,j;    for(i=1;i<=strlen(x);i++)    {        for(int j=1;j<=strlen(y);j++)        {            if(x[i-1]==y[j-1])            {                num[i][j]=num[i-1][j-1]+1;                flag[i][j]=1;//向下标记            }            else if(num[i][j-1]>num[i-1][j])            {                num[i][j]=num[i][j-1];                flag[i][j]=2;//向右标记            }            else            {                num[i][j]=num[i-1][j];                flag[i][j]=3;//向下标记            }        }    }}int main(){    while(scanf("%s %s",x,y)!=EOF)    {        memset(num,0,sizeof(num));        memset(flag,0,sizeof(flag));        LCS();        printf("%d\n",num[strlen(x)][strlen(y)]);    }    return 0;}