- 21
- 0
- 约1.8千字
- 约 6页
- 2018-07-02 发布于上海
- 举报
/*实验三:最长公共子序列问题 内容:输入两个相同类型的序列,用动态规划方法计算他的最长公共子序列的长度以及举例。 */#includeiostream#includestringusing namespace std;#define maxlength 11class LCS{public: LCS(int nx,int ny,char *x,char *y) //对数据成员m、n、a、b、c、s初始化 { m=nx; n=ny; a=new char[m+2]; b=new char[n+2]; memset(a,0,m+2); memset(b,0,n+2); //将x和y中的字符写入一维数组a和b中 for(int i=0;inx+2;i++) { a[i+1]=x[i]; } for(i=0;iny+2;i++) { b[i+1]=y[i]; } a[0]=b[0]=0; c=new int[maxlength][maxlength]; s=new int[maxlength][maxlength]; //对二维数组c和s进行初始化 for(i=0;imaxlength;i++) { for(int j=0;jmaxlength;j++) { s[i][j]=0; c[i][j]=0; } } } int LCSLength(); void CLCS() { CLCS(m,n); }private: void CLCS(int i,int j)const; int (*c)[maxlength],(*s)[maxlength]; int m,n; char *a,*b;};//6、类中成员函数主要有LCSLength()和CLCS()两个公有成员函数,CLCS()通过调用私有递归 //成员函数CLCS(int t,int j)实现。int LCS::LCSLength(){ for(int i=0;i=m;i++) c[i][0]=0; for(int j=0;j=n;j++) c[0][j]=0; for(i=1;i=m;i++) { for(int j=1;j=n;j++) { if(a[i]==b[j]) { c[i][j]=c[i-1][j-1]+1; s[i][j]=1; } else if(c[i-1][j]=c[i][j-1]) { c[i][j]=c[i-1][j]; s[i][j]=2; } else { c[i][j]=c[i][j-1]; s[i][j]=3; } } } return c[m][n]; //返回最优解值}void LCS::CLCS(int i,int j)const{ if(i==0||j==0||s[i][j]==0) return; if(s[i][j]==1) { CLCS(i-1,j-1); couta[i]; } else if(s[i][j]==2) CLCS(i-1,j); else CLCS(i,j-1);}//7、主函数中负责输入两个待比较的字符串x和y(长度不超过maxlength-1),求得他们的实际//字符长度nx和ny,并调用LCS类的成员函数LCSLength()和CLCS()求最优解值和最优解:int main(){ int nx,ny; char *x,*y; x=new char[maxlength]; y=new char[maxlength]; cout请输入Xendl; gets(x); nx=strlen(x); cout请输入Yendl; gets(y); ny=strlen(y); LCS lcs(nx,ny,x,y); cout X和Y最长公共子序列的长度为:lcs.LCSLength()endl; cout该序列为endl; lcs.CLCS(); coutendl; delete []x; delete []y; return 0;}问题记录:
原创力文档

文档评论(0)