动态规划法解决最长公共子序列问题


动态规划法解决最长子序列问题

**
一个数列,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则称为已知序列
的最长公共子序列。
设序列 X={x1,x2,…,xm}和 Y={y1,y2,…,yn}的最长公共子序列为 Z={z1,z2,…,zk} ,则
– 若 xm=yn,则 zk=xm=yn,且 Zk-1是 Xm-1 和 Yn-1 的最长公共子序列
– 若 xm≠yn 且 zk≠xm,则 Z 是 Xm-1 和 Y 的最长公共子序列
– 若 xm≠yn 且 zk≠yn,则 Z 是 X 和 Yn-1的最长公共子序列
求最长公共子序列的递归式:用 c[i][j]记录序列 Xi和 Yj的最长公共子序列的长度。
其中, Xi={x1,x2,…,xi};Yj={y1,y2,…,yj}

以下是代码实现:

#include
using namespace std;
int b[1024][1024];
int c[1024][1024];
void LSCLength(int m,int n,char *x,char *y){
int i,j;
for(i=1;i<=m;i++){
c[i][0]=0;
}
for(i=1;i<=n;i++){
c[0][i]=0;
}
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
if(x[i]y[i]){
c[i][j]=c[i-1][j-1]+1;
b[i][j]=1;
}
else if(c[i-1]>=c[i]){
c[i][j]=c[i-1][j];
b[i][j]=2;
}else{
c[i][j]=c[i][j-1];
b[i][j]=3;
}
}
}
}
void LSC(int i,int j,char *x){
if(i0||j==0)

猜你喜欢

转载自blog.csdn.net/qq_42602282/article/details/103098869