9动态规划(03线型问题).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
9动态规划(03线型问题)

动态规划(线型问题) 线型动态规划 线型动态规划问题,最典型的特征就是状态都在一条线上,并且位置固定,问题一般都规定只能从前往后取状态,解决的办法是根据前面的状态特征,选取最优状态作为决策进行转移。 设前i个点的最优值,研究前i-1个点与前i个点的最优值,利用第i个点决策转移,如下图。 状态转移方程一般可写成: 问题描述 最大连续子序列和: 1 2 -3 4 5 (结果9) 最长公共子字符串:BDAABA和ABCBDAB(BDA结果3) 最长公共子序列:abcfbc与abfcab (结果为4(abcb、abfc)) 最长上升子序列:1 7 3 5 9 4 8(结果为4(1 3 5 9、1 3 5 8、1 3 4 8)) 最大上升子序列和:1 7 3 5 9 4 8(结果为18(1 3 5 9) 最长公共子上升序列:1 4 2 5 9 和9 1 2 4(结果为2(1 4、1 2)) 编辑距离:kitten和sitting(结果为3(k改s,e改i,n后插入g)) 1.最大连续子序列和 /140914/3/ 描述:给定n及数组A1,A2,A3……An,求最大连续子序列和 输入:第一行一个n,n100000 第二行n个数,用空格隔开,每个数小于100000 输出:最大连续子序列和 样例输入 5 1 2 -3 4 5 样例输出 9 当j确定时,若要s[j]-s[i-1]最大,则需s[i-1]最小。因此只需要扫描一次数组,维护“目前遇到过的最小S”。 状态转移方程:maxsum=max(s[j]-s[i-1]) #includeiostream #define MAXN 100100 int a[MAXN],s[MAXN]; using namespace std; int main(){ int i,maxsum,n,min_s; cinn; s[0]=0; for(i=1;i=n;i++){ cina[i]; s[i]=s[i-1]+a[i]; } maxsum=a[0]; min_s=0; for(i=1;i=n;i++){ if(maxsums[i]-min_s)maxsum=s[i]-min_s; if(min_ss[i])min_s=s[i]; } coutmaxsumendl; return 0; } 2.最长公共子字符串 子字符串的定义和子序列的定义类似,但要求是连续分布在其他字符串中。比如输入两个字符串BDAABA和ABCBDAB的最长公共字符串有BDA和AB,最长长度为3。 A B C B D A B B 0 1 0 1 0 0 1 D 0 0 0 0 1 0 0 A 1 1 0 0 0 1 0 A 1 0 0 0 0 1 0 B 0 1 0 1 0 0 1 A 1 0 0 0 0 1 0 A B C B D A B B 0 1 0 1 0 0 1 D 0 0 0 0 2 0 0 A 1 1 0 0 0 3 0 A 1 0 0 0 0 1 0 B 0 2 0 1 0 0 1 A 1 0 0 0 0 1 0 参考代码: #includeiostream #includestring #define MAXN 1100 using namespace std; char a[MAXN],b[MAXN]; int f[MAXN][MAXN]; int main(){ int ans,lena,lenb,i,j; cinab; lena=strlen(a);lenb=strlen(b); memset(f,0,sizeof(f)); ans=0; for(i=1;i=lena;i++) for(j=1;j=lenb;j++) if(a[i-1]==b[j-1]){ f[i][j]=f[i-1][j-1]+1; if(ansf[i][j])ans=f[i][j]; } coutansendl; return 0; } 3.最长公共子序列LCS:两个有序序列s1(长度为len1)和s2(长度为len2),求最长公共子序列的长度。如:abcfbc与abfcab 最长长度为4(abcb、abfc…序列不唯一) 输入 输入包括多组测试数据。每组数据包括一行,给出两个长度不超过200的字符串,表示两个序列。两个字符串之间由若干个空格隔开。 输出 对每组输入数据,输出一行,给出两个序列的最大公共子序列的长度。 样例输入 abcfbc abfcab programming contest abcd

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档