最长公子序列
来源:互联网 发布:手机电脑连接软件 编辑:程序博客网 时间:2024/04/26 05:16
#include <iostream>const int MAX=10;using namespace std;void LCSLength(int m,int n, char *x,char *y,int **c, int **b){ int i,j; for(i=1; i<=m; i++) c[i][0]=0; for(j=1; j<=n; j++) c[0][j] =0; for(i=1; i<=m; i++) for(j=1; j<=n; j++) { if(x[i-1]==y[j-1])//x[i],y[i] { 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]=3; } else { c[i][j] = c[i][j-1]; b[i][j]=2; } }}void LCS(int i,int j,char *x, int **b){ if(i==0||j==0) return; if(b[i][j]==1) { LCS(i-1,j-1,x,b); cout<<x[i-1];//x[i] } else if(b[i][j]==2) { LCS(i,j-1,x,b); } else LCS(i-1,j,x,b);}int main(){ int m=8,n = 7; char X[] = {'A','B','C','B','D','A','B'}; char Y[]= {'B','D','C','A','B','A'}; int **c = new int*[m]; int **b = new int*[m]; for(int i=0; i<=m; i++) { c[i] = new int[n]; b[i] = new int[n]; } cout<<"序列X"<<endl; for(int i=0; i<m-1; i++) { cout<<X[i]<<" "; } cout<<endl; cout<<"序列Y"<<endl; for(int i=0; i<n-1; i++) { cout<<Y[i]<<" "; } cout<<endl; LCSLength(m,n,X,Y,c,b); int i=m,j=n; cout << "最长公共子序列为" << endl; LCS(i,j,X,b); return 0;}