您的位置:首页 > 其它

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

2012-07-11 14:32 204 查看
时限: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: