您的位置:首页 > 其它

动态规划-最长公共子序列

2013-04-28 23:24 232 查看

最长公共子序列

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

#include <iostream>
#include <string>
using namespace std;
void LCSLength(int m,int n,char *x,char *y,int c[][200])
{
int i,j;
for(i=1;i<=m;i++)
c[i][0]=0;
for(i=1;i<=n;i++)
c[0][i]=0;

/* for(int a=0;a<m;a++)
{
for(int b=0;b<n;b++)
cout<<c[a][b]<<" ";
cout<<endl;
}*/

//cout<<x[0]<<" "<<y[0]<<endl;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(x[i]==y[j])
c[i][j]=c[i-1][j-1]+1;
else if(c[i-1][j]>=c[i][j-1])
c[i][j]=c[i-1][j];
else
c[i][j]=c[i][j-1];
}
/*for(int a=1;a<=m;a++)
{
for(int b=1;b<=n;b++)
cout<<c[a][b]<<" ";
cout<<endl;
}*/

cout<<c[m]
<<endl;
}
int main()
{
string dataA;
string dataB;
int c[200][200];
//dataA[0]=;
//dataB[0]="0";
char *x,*y;
cin>>dataA;
cin>>dataB;
int m=dataA.length();
int n=dataB.length();
//cout<<m<<" "<<n<<endl;
x=new char[m+2];
y=new char[n+2];
int i;
for(i=0;i<m;i++)
x[i+1]=dataA[i];
x[i+1]='\0';

for(i=0;i<n;i++)
y[i+1]=dataB[i];
y[i+1]='\0';

//cout<<x<<endl;
//cout<<y<<endl;
//cout<<x[1]<<endl;
//cout<<y[1]<<endl;
LCSLength(m,n,x,y,c);

}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: