最长公共子序列问题.DOC

上传人:天*** 文档编号:1322421 上传时间:2019-02-08 格式:DOC 页数:5 大小:150.50KB
下载 相关 举报
最长公共子序列问题.DOC_第1页
第1页 / 共5页
最长公共子序列问题.DOC_第2页
第2页 / 共5页
最长公共子序列问题.DOC_第3页
第3页 / 共5页
最长公共子序列问题.DOC_第4页
第4页 / 共5页
最长公共子序列问题.DOC_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、1、最长公共子序列问题1)程序代码:#includevoid length(int m,int n,char *x,char *y,int c20,int b20);void lcs(int i,int j,char *x,int b20); void main() char x20,y20;int c2020,b2020;int m=1,n=1;printf(“ * * * * * * * * * * * * * * * * * * n“);printf(“ 求最长公共子序列问题 n“);printf(“ * * * * * * * * * * * * * * * * * * n“);pri

2、ntf(“ 请输入 X 序列:“); /输入 x 序列while(1)scanf(“%c“,if(xm!=n) m+;else break;m- =1;printf(“ 请输入 Y 序列:“); /输入 y 序列while(1)scanf(“%c“,if(yn!=n) n+;else break;n- =1;length(m,n,x,y,c,b);printf(“ x 和 y 的最长公共子序列为: “);lcs(m,n,x,b);printf(“ 其长度为: %dn“,cmn);void length(int m,int n,char *x,char *y,int c20,int b20) i

3、nt i,j;for (i = 0; i =cij-1) /最后一值不等的情况,找 xm-1和 y 及 x 和 yn-1中较长的公共子序列,并记录是由哪一个子问题得到的 cij=ci-1j; bij=2;else cij=cij-1; bij=3; void lcs(int i,int j,char *x,int b20)if (i=0|j=0) return ; /无值时返回if (bij=1) lcs(i-1,j-1,x,b); printf(“ %c “,xi); /根据某值是由哪个子问题的到的,循环调用求其最长公共子序列else if (bij=2) lcs(i-1,j,x,b);el

4、se lcs(i,j-1,x,b);2)运行成功,截图如下:二、最大子段和问题(分治算法)1)程序代码:#includeint maxsubsum(int a6,int left,int right);void main()int k;3int a6=-2,11,-4,13,-5,-2;k=maxsubsum(a,0,5);printf(“ * * * * * * * * * * * * * * * * * * * * * * * * * n“);printf(“ 求整数序列的最大子段和问题(分治算法) n“);printf(“ * * * * * * * * * * * * * * * *

5、* * * * * * * * * n“);printf(“ 整数序列 -2,11,-4,13,-5,-2 的最大子段和为:%d“,k);int maxsubsum(int a6,int left,int right)int sum=0;if(left=right) sum=aleft0?aleft:0; /当数列只有一个元素时,若为负数,则将 sum 赋为 0,否则输出 sum 值elseint center=(left+right)/2; /取中间数int leftsum=maxsubsum(a,left,center); /对数组左半段递归求和int rightsum=maxsubsum

6、(a,center+1,right); /对数组右半段递归求和int s1=0; /左右两段均包含最大子段和中数的情况int lefts=0;for(int i=center;i=left;i-) /求左半段中的最大子段和lefts+=ai;if(leftss1) s1=lefts;int s2=0;int rights=0;for(i=center+1;is2) s2=rights;sum=s1+s2; /第三种情况中的最大子段和if(sumint maxsum(int n, int a6);void main()int k;int a6=-2,11,-4,13,-5,-2;k=maxsum

7、(6,a);printf(“ * * * * * * * * * * * * * * * * * * * * * * * * * n“);printf(“ 求整数序列的最大子段和问题(动态规划算法) n“);printf(“ * * * * * * * * * * * * * * * * * * * * * * * * * n“);printf(“ 整数序列 -2,11,-4,13,-5,-2 的最大子段和为:%d“,k);int maxsum(int n, int a6)int sum=0, b=0;for (int i=0; i0) b+=ai; /当 ai0 时,b=ai+ai+1;else b=ai; /否则, b=ai;if (bsum) sum=b; /将大值赋给 sumreturn sum; /返回最大子段和2)运行成功,截图如下:5

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 1

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。