最长公共子序列(动态规划)

时限: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

输入样例:

ammbcdefg

abcfgde

输出样例: 4

#include<stdio.h>
#include<string.h>
char Arr[201],Brr[201];//A[0~200],B[0~200]
int n1,n2;
void search()
{
    int i,j;
    int List[201][201];//A,B长度范围在0~200之间
    for(i=0;i<=n1;i++)//A长度为i,B长度为0
        List[i][0]=0;
    for(j=0;j<=n2;j++)//A长度为0,B长度为j
        List[0][j]=0;
    for(i=1;i<=n1;i++)
    {    for(j=1;j<=n2;j++)
        {   if(Arr[i-1]==Brr[j-1])//Arr[]从下标0开始与Brr[]匹配
                List[i][j]=List[i-1][j-1]+1;//匹配结果数组从1开始计算起
            else
            {    if(List[i-1][j]>List[i][j-1])
                    List[i][j]=List[i-1][j];
                else
                    List[i][j]=List[i][j-1];
            }
        }
    }
    printf("%d\n",List[n1][n2]);//得到长度为n1的A与长度为n2的B的最长公共子序列
}
int main()
{
    gets(Arr);
    gets(Brr);
    n1=strlen(Arr);
    n2=strlen(Brr);
    search();
    return 0;
}

 

posted on 2012-07-11 14:32  IThinktan  阅读(428)  评论(0编辑  收藏  举报

导航