算法分析与设计实验 动态规划法 求最长公共子序列
实验目的
加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的
最长公共子序列问题。
实验内容
内容: 用动态规划法实现求两序列的最长公共子序列,其比较结果可用于基因比较、文
章比较等多个领域。
要求:掌握动态规划法的思想,及动态规划法在实际中的应用; 分析最长公共子序列的
问题特征,选择算法策略并设计具体算法,编程实现两输入序列的比较, 并输出它们的最长
公共子序列。
加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的
最长公共子序列问题。
实验内容
内容: 用动态规划法实现求两序列的最长公共子序列,其比较结果可用于基因比较、文
章比较等多个领域。
要求:掌握动态规划法的思想,及动态规划法在实际中的应用; 分析最长公共子序列的
问题特征,选择算法策略并设计具体算法,编程实现两输入序列的比较, 并输出它们的最长
公共子序列。
实验代码:
/****************************************************** * File Name: LCS.cpp * Author: 王宇虹 * Create Time: 2015年05月07日 星期四 17时15分21秒 ******************************************************/ #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> using namespace std; #define maxlength 110 int i,j; int nx,ny; char *x=new char[maxlength],*y=new char[maxlength]; class LCS { public: LCS(int nx,int ny) //对数据成员进行初始化 { m=nx; n=ny; //对m和 n赋值 a=new char[m+2]; //考虑下标为0的元素和字符串结束标记 b=new char[n+2]; strcpy(a,x); strcpy(b,y); } int LCSLength(); void CLCS() //构造最优解(最长公共子序列) { CLCS(m,n); //调用私有成员函数CLCS(int,int) } private: void CLCS(int i,int j); int c[maxlength+1][maxlength+1],s[maxlength][maxlength]; //前者用来存最长子序列长度,后者用来存最长子序列 int m,n; char *a,*b; }; int LCS::LCSLength() { //清零 for(i=0 ; i<=m ; i++ ) for( j=0 ; j<=n ; j++ ) { c[i][j]=0; s[i][j]=0; } for(i = 0; 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]) { 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) { // cout<<"test:"<<"CLCS()"<<endl; if(i==0||j==0) return; if(s[i][j]==1) { CLCS(i-1,j-1); cout<<a[i-1]; } else if(s[i][j] == 2) CLCS(i-1,j); else CLCS(i,j-1); } int main() { printf("请输入两个字符串:(以空格或者回车间隔):\n"); cin>>x; cin>>y; nx=strlen(x); //字符串x长度 ny=strlen(y); //字符串y长度 // cout<<"test:"<<x<<" "<<nx<<endl; //调试:用来测试输入情况 // cout<<"test:"<<y<<" "<<ny<<endl; LCS lcs(nx,ny); int length=lcs.LCSLength(); printf("最长公共子序列长度:%d\n",length); printf("最长公共子序列:"); lcs.CLCS(); printf("\n"); delete []x; delete []y; return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
posted on 2015-05-07 18:18 Tob__yuhong 阅读(156) 评论(0) 编辑 收藏 举报