



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2017年计算机等级考试二级C++辅导:最长公共子序列一、算法思想一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。最长公共子序列就是求给定两个序列的一个最长公共子序列。动态规划可以有效的解决此问题。由最长公共子序列问题的子序列的子结构性质,可以建立子问题的递归关系。用c[i][j]记录序列Xi和Yi的最长公共子序列的长度,递归关系如下:0i=0,j=0c[i][j]=c[i-1][j][j-1]+1i,j>0;xi==yjmaxc[i][j-1],c[i-1][j]I,j>0;xi==yj在具体的算法设计中,以序列X={x1,x2,x3,…,xm}和Y={y1,y2,y3,…,ym}作为输入。输出三个数组c,b,temp。其中c[i][j]存储Xi和Yj的公共子序列的长度,b[i][j]记录c[i][j]的值是由哪一个子问题的解得到的,这在构造最长公共子序列时要用到。问题得解,即X和Y得最长公共子序列记录在temp[h]中。二、源代码下面是在MicrosoftVisualC++6.0中编写的求最长公共子序列的源程序,程序定义了得字符串长度为99,是将p48页的动态规划算法改写而来的。#include#include#defineMAX99//typedefcharMM;voidmain(){inti,j,m,n,h=0;charx[MAX]={'',''},y[MAX]={'',''},b[MAX][MAX]={''};intc[MAX][MAX]={0};chartemp[MAX]={''};cout<<"**本程序可以求得字符数在99以内的任意两个字符串的公共子序列**\n";cout<<"请输入第一个字符串的长度m=";cin>>m;cout<<"请输入第一个字符串(“回车”结束)\n如果输入的字符数超过m,则会出错!\nx["<for(i=1;i<=m;i++)cin>>x[i];//键盘输入x和ycout<<"请输入第二个字符串的长度n=";cin>>n;cout<<"请输入第二个字符串\ny["<for(i=1;i<=n;i++)cin>>y[i];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[j]){c[i][j]=c[i-1][j-1]+1;b[i][j]='\\';}elseif(c[i-1][j]>=c[i][j-1]){c[i][j]=c[i-1][j];b[i][j]='│';}else{c[i][j]=c[i][j-1];b[i][j]='-';}}//动态规划结束cout<<"c[m][n]中的内容:\n";for(i=0;i<=m;i++){for(j=0;j<=n;j++)cout<cout<}cout<<"b[m][n]中的内容:\n";for(i=1;i<=m;i++){for(j=1;j<=n;j++)cout<cout<}i=m,j=n;while(1){if(i==0││j==0)break;if(b[i][j]=='\\'){temp[h++]=x[i];//反序记录最长公共子序列到temp中i=i-1,j=j-1;}elseif(b[i][j]=='│')i=i-1;elsej=j-1;}cout<<"\nx["<for(i=h-1;i>=0;i--)//格式化输出最长公共子序列if(i==h-1)if(h==1)cout<<"LCS:<"<elsecout<<"LCS:<"<elseif(i==0)cout<<","<elsecout<<","<cout<<"\n"<}三、运算结果其实它的最长公共子序列不止一个,这里只输出了其中的一个。四、总结分析在这个具体的算法中,还有可以改进的地方,比如在具体的求公共子序列中,可以不必要MAX的宏定义,只需将各数组设为具体的长度就可以节约不少的空间,大大降低程序的空间复杂度,但是为了键盘输入任意字符串,牺牲了很多的内存空间。在键盘输入字符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 统编版五年级语文上册第二单元拔尖测评卷(含答案)
- iphone代理合同范本
- 购买水车股份合同范本
- 中建钢筋合同范本
- 消防施工简单合同范本
- 桐乡劳动合同范本
- 酒店式托管合同范本
- 房屋家具转让合同范本
- 资产收购居间合同范本
- 建筑居间工程合同范本
- 中外航海文化知到课后答案智慧树章节测试答案2025年春中国人民解放军海军大连舰艇学院
- 心肺复苏术课件2024新版
- GB/T 1228-2006钢结构用高强度大六角头螺栓
- 第二章-基因工程的载体和工具酶课件
- 政府采购评审专家考试题库(含答案)
- 实验室新员工入职培训课件
- 动力柜技术协议
- 2023年青岛市城阳区工会系统招聘考试笔试题库及答案解析
- 高中生物第一课-(共24张)课件
- 电气原理图基础知识课件
- 水利工程管理单位定岗标准(试点)
评论
0/150
提交评论