1 最长公共子序列

1 最长公共子序列

ID:38075859

大小:21.79 KB

页数:5页

时间:2019-05-26

1 最长公共子序列_第1页
1 最长公共子序列_第2页
1 最长公共子序列_第3页
1 最长公共子序列_第4页
1 最长公共子序列_第5页
资源描述:

《1 最长公共子序列》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、1最长公共子序列日积月累-算法与2009-10-1911:08:33阅读577评论0字号:大中小订阅一个给定序列的子序列是在该序列中删去若干元素后得到的序列。最长公共子序列问题是给定两个序列X={x1,x2...xm}和Y={y1,y2...yn},找出X和Y的最长公共子序列,用动态规划算法可有效的解些问题。最长公共子序列的结构:设X={x1,...,xm},Y={y1,...,yn}及它们的最长子序列Z={z1,...,zk}则1、若xm=yn,则zk=xm=yn,且Z[k-1]是X[m-1]和Y[

2、n-1]的最长公共子序列2、若xm!=yn,且zk!=xm,则Z是X[m-1]和Y的最长公共子序列3、若xm!=yn,且zk!=yn,则Z是Y[n-1]和X的最长公共子序列子问题的递归结构:当i=0,j=0时,c[i][j]=0当i,j>0;xi=yi时,c[i][j]=c[i-1][j-1]+1当i,j>0;xi!=yi时,c[i][j]=max{c[i][j-1],c[i-1][j]}由以上分析,先计算最优值,再构造最长公共子序列,C++源程序如下:#include#includ

3、e#include"iostream"usingnamespacestd;intlength=0;//记录最长公共序列长度//计算最优值voidlcs(stringx,stringy,int**b){inti,j;//获取字符串的长度intm=x.size();intn=y.size();//创建动太二维数组int**c;c=newint*[m+1];for(inti=0;i

4、[0]=0;for(i=1;i<=n;i++)c[0][i]=0;c[0][0]=0;//遍历记录最优值,并将标识存在数组b中for(i=1;i<=m;i++)for(j=1;j<=n;j++){if(x[i-1]==y[j-1]){//xm=yn,则zk=xm=yn,且Z[k-1]是X[m-1]和Y[n-1]的最长公共子序列c[i][j]=c[i-1][j-1]+1;b[i][j]=1;}elseif(c[i-1][j]>c[i][j-1]){//xm!=yn,且zk!=xm,则Z是X[m-1]和Y

5、的最长公共子序列c[i][j]=c[i-1][j];b[i][j]=2;}else{//xm!=yn,且zk!=yn,则Z是Y[n-1]和X的最长公共子序列c[i][j]=c[i][j-1];b[i][j]=3;}}//释放空间for(inti=0;i

6、

7、j==0)return;//从b[m][n]开始,用递归依其值在数组b

8、中搜索if(b[i][j]==1){//xi和yj的最长公共子序列是由x(i-1)和y(j-1)的最长公共子序列在尾部加上xi所得到的子序列show(i-1,j-1,x,b);length++;cout<

9、ingx;stringy;int**b;cout<<"输入第一个序列";cin>>x;cout<<"输入第二个序列";cin>>y;intm=x.size();intn=y.size();//创建二维动态数组b=newint*[m+1];for(inti=0;i

10、nti=0;i是序列X=的子序列当且仅当存在严格上升的序列,使得对j=1,2,...,k,有xij=zj。比如Z=是X=的子序列。现在给出两个序列X和Y,你的任务是找到X

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。