最长公共字序列

来源:互联网 发布:诺基亚衰落的原因知乎 编辑:程序博客网 时间:2024/06/06 04:10

最长公共子序列

时限:1000ms 内存限制:200000K  总时限:3000ms

描述
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有:

Xij = Zj

如果一个序列S即是A的子序列又是B的子序列,则称S是A、B的公共子序列。
求A、B所有公共子序列中最长的序列的长度。
 
输入
输入共两行,每行一个由字母和数字组成的字符串,代表序列A、B。A、B的长度不超过200个字符。
 
输出
一个整数,表示最长各个子序列的长度。
格式:printf("%d\n");
 
输入样例
programming
contest
 
输出样例
2
 
提示
 



C++代码:

#include<stdio.h>

#include<string.h>
using namespace std;
int lcs_length(char x[],char y[]);
int main()
{
    char x[200],y[200];
    int len;


    scanf("%s%s",x,y);
    len=lcs_length(x,y);
    printf("%d\n",len);
}
int lcs_length(char x[],char y[])
{
    int m,n,i,j,l[200][200];
    m=strlen(x);//jisuan zifuchuan changdu 
    n=strlen(y);


    for(i=0; i<m+1; i++)
        l[i][0]=0;


    for(j=0; j<n+1; j++)
        l[0][j]=0;


    for(i=1; i<=m; i++)
    {


        for(j=1; j<=n; j++)


            if(x[i-1]==y[j-1])


               {
                   l[i][j]=l[i-1][j-1]+1;


               }
            else


                if(l[i][j-1]>l[i-1][j])


                   {
                       l[i][j]=l[i][j-1];
                   }
                else


                    l[i][j]=l[i-1][j];


    }
    return l[m][n];
}
1 0
原创粉丝点击