实验四:动态规划法求最长子序列

实验四:动态规划法求最长子序列

ID:22287569

大小:90.57 KB

页数:5页

时间:2018-10-28

实验四:动态规划法求最长子序列_第1页
实验四:动态规划法求最长子序列_第2页
实验四:动态规划法求最长子序列_第3页
实验四:动态规划法求最长子序列_第4页
实验四:动态规划法求最长子序列_第5页
资源描述:

《实验四:动态规划法求最长子序列》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、实验四:动态规划法求两个序列的最长公共子序列及其长度姓名:刘桂莲班级:计科2班(数字媒体)学号:1025113018实验内容应用第8章的动态规划法求出两个序列屮最长的公共子序列及其长度。分析时间复杂度。例如,”123”和”132”的扱长公共子序列是”12”(不一定是连续的)。算法思想•动态规划的思想:-对较小的子问题进行一次求解,并把结果记录下来,然后利用较小问题的解,求解出较大问题的解,直到求解出最大问题的解。0if/=0orj=(K(■[/-l.y-l

2、+1if/j'>0and.v(=,max((仏j-1-kjl)if/j'>0andA;.引进一个二维数组ch[MAX][MAX],用ch[

3、i][j]记录CHI与CH2的LCS的长度,b[i][j]记录ch[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向。我们是自底向上进行递推计算,那么在计算ch[i,j]之前,ch[i-l][j-l],ch[i-l][j]与ch[i][j-l]均己计算出来。此吋我们根据CHI[i]=CH2[j]还是CHl[i]!=CH2[j],就可以计算出ch[i][j]。算法length(stringCHI,stringCH2,intb[MAX][MAX])//用于构建动态数组//输入:两字符窜//输出:最长公共子序列for(i=1;i<=ch1Len;i++)//二重循环求解for(intj=l;

4、j<=ch2Len;j++)if(CHl[i-l]==CH2fj-l])//相等字符{ch[i]U]=ch[i-l]U-l]+l;b[i]U]=O;}elseif(ch[i-1][j]>=ch[i][j-l])//上比较大{ch[i][j]=ch[i-l]U];b卿=1;}else//左比较大{ch[i][j]=ch[i]

5、j-l];bUJUJ=-l;}}printCS(intb[MAX][MAX],stringx,inti,intj)//回溯求出®长子序列输出//输入:标记数组//输出:最长子序列1叩=()

6、

7、』二=0)//边界,返回return;if(b[i]u]==o){printCS(

8、b,x,i-1,j-1);//左上cout«x[i-ll«MH;}elseif(b[i][j]==1)printCS(b,x,i-1,j);//上elseprintCS(b,x,i,j-l);//左源程序#include#include#includeusingnamespacestd;#defineMAX100//糸氺糸氺糸氺糸氺糸氺氺氺氺氺+了~^*******************************^******voidprint(inta[MAX][MAX],intb,intc)for(inti=0;i<=b;i++)for

9、(intj=O;j<=c;j++)cout«a[i]

10、jj«nH;}cout«endl;}*1^*y*}//氺氺承氺承氺承氺承氺氺氺氺氺氺氺氺氺氺intlength(stringCH1,stringCH2,intb[MAXKMAXl){intch[MAX][MAX],max=l;intchiLen=CH1.length(),ch2Len=CH2.1ength();//求字符窜长度for(inti=O;i<=chlLen;i++)//初始化动态数组为0for(intj=0;j<=ch2Len;j++){ch[i]

11、j]=O;}for(i=1;i<=ch1Len;i++)//二重循环填充动态数组f

12、or(intj=l;j<=ch2Len;j++){if(CHl[i-l]==CH2[j-l])//相等字符{ch[i]o]=ch[i-i]

13、j-i]+i;b[i]U]=O;}elseif(ch[i-l]U]〉=ch[i]Lj-l])//上比较大{//ch[i][j]=Max(ch[i]

14、j-l],ch[i-l][j]);ch[i][j]=ch[i-l][j];bri]fjl=l;}else//左比较大ch[i][j]=ch[i]U-l];b[i]U]=_l;}}cout<<"动态规划矩阵:"«endl;print(ch,ch1Len,ch2Len);//打印动态规划矩阵returnch[ch1

15、Len][ch2Len];voidprintCS(intb[MAXl[MAXl,stringx,inti,intj){if(i==0

16、

17、j==0)return;if(b[iJUJ==0){printCS(b,x,i-1,j-1);//左上cout«x[i-l]«")elseif(b[i][j]==1)printCS(b,x,i-l,j);//上elseprintCS(b,x,i,j-1);//左}

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

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

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