最长公共子序列

来源:互联网 发布:php读取图片文件 编辑:程序博客网 时间:2024/04/29 18:50

最长公共子序列

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。
tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
输入
第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000.
输出
每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
样例输入
2asdfadfsd123abcabc123abc
样例输出
36



在求X={x1,x2,x3,…,xm}和Y={y1,y2,y3,…,yn}的一个LCS时,需要求解一个或两个子问题。

如果xm=yn,就应该求Xm-1和Yn-1的一个LCS。

如果xm!=yn,就应该求两个子问题,xm-1和yn的一个LCS和xm与yn-1的一个LCS,比较其中较长着为元问题的一个LCS。

状态方程为:

C[i][j]为Xi和Yj的LCS的长度。

 

 

 

 

 

首先从b[m][n]开始,依次在其中搜索。

当b[i][j]==1时,表示xi和yi的最长公共子序列是由xi-1 yj-1的最长子序列在尾部加上xi所得;

当b[i][j]==2时,表示xi和yi的最长公共子序列和xi-1 yj的最长子序列相同;

当b[i][j]==3时,表示xi和yi的最长公共子序列和xi  yj-1的最长子序列相同;

#include<iostream>#include<cstring>using namespace std;#define N 1000int c[N][N],n,m,b[N][N];int LCS_LENGTH(char x[],char y[]){m=strlen(x+1);n=strlen(y+1);int i,j;for(i=1;i<=m;++i)c[i][0]=0;for(j=0;j<=n;++j)c[0][j]=0;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;b[i][j]=1;}else if(c[i-1][j]>=c[i][j-1]){c[i][j]=c[i-1][j];b[i][j]=2;}else{c[i][j]=c[i][j-1];b[i][j]=3;}}}return 0;}/*void LCS(int i,int j,char x[],int b[N][N]){if(i+j==0)return;if(b[i][j]==1){LCS(i-1,j-1,x,b);cout<<x[i];}else if(b[i][j]==2)LCS(i-1,j,x,b);elseLCS(i,j-1,x,b);}*/int main(){int p;cin>>p;while(p--){char x[N+1],y[N+1];cin>>x+1>>y+1;LCS_LENGTH( x, y);    //LCS(m,n,x,b);cout<<c[m][n]<<endl;}return 0;}


原创粉丝点击