- 1、本文档共53页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
noip动态规划讲解
For i:=1 To n-1 Do For j:=1 To 2*n-i Do Begin f[j,j+i]:=Maxlongint; For k:=j To j+i Do If f[j,j+i]f[j,k]+f[k+1,j+i] Then f[j,j+i]:=f[j,k]+f[k+1,j+i]; f[j,j+i]:=f[j,j+i]+Sum[j,j+i]; End; 这样,求归并的最大值也是同样的方法,不再赘述。 * Sample Problem9 能量项链(NOIp2006) 在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有N颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为(Mars单位),新产生的珠子的头标记为m,尾标记为n。 需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使一串项链释放出的总能量最大。 例如:设N=4,4颗珠子的头标记与尾标记依次为(2,3) (3,5) (5,10) (10,2)。我们用记号⊕表示两颗珠子的聚合操作,(j⊕k)表示第j,k两颗珠子聚合后所释放的能量。则第4、1两颗珠子聚合后释放的能量为(4⊕1)=10*2*3=60。 这一串项链可以得到最优值的一个聚合顺序所释放的总能量为 ((4⊕1)⊕2)⊕3)=10*2*3+10*3*5+10*5*10=710。 * Sample Problem10 乘积最大(NOIp2000) 【问题描述】 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。 【输入】 程序的输入共有两行: 第一行共有2个自然数N,K(6≤N≤40,1≤K≤6) 第二行是一个长度为N的数字串。 【输出】 输出所求得的最大乘积(一个自然数)。 【样例输入】 4 2 1231 【样例输出】 62 * 这道题目要求把一个长度为n的数字串分成k段,使得每段的乘积最大。 通过刚才的石子归并思想,我们可以用f[i,j]表示前i个数字我分了j段所能得到的最大值,那么f[i,j]就可以从f[k,j-1](前k个数字分成了j-1段)推来,因为f[i,j]就是f[k,j-1]和(k+1~i)这段数字串的乘积。 于是状态转移方程即可得出: f[i,j]:=Max{f[k,j-1]*Number[k+1,i]} (j-1=ki) 其中Number[k+1,j]表示数字串从第k+1位到第i位转换成数字的值。 对于题目中所说的具有很强枚举意味的变量(如k段,n次等),一般将其放入状态中枚举。而诸如最大值最小值之类的变量,一般放入数组中作为值递推。 * Sample Problem11 统计单词个数(NOIp2001) 【问题描述】 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串 以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分 成k份(1k=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。 例如字符串this中可包含this和is,选用this之后就不能包含th)。单词在给出 的一个不超过6个单词的字典中。要求输出最大的个数。 【样例输入】 3 thisisabookyouareaoh 4 is a ok sab 【样例输出】 7 this / isabookyoua / reaoh * 看到这道题目应该马上有这种意识了:和乘积最大神似! 所以本题除了求出i~j之间有多少单词以外基本上就没什么难度了。预处理出i~j之间有多少单词,其实也可以用DP。 首先,题目告诉我们,如果a是b的前缀,那么b肯定没用了(为什么)。所以第一步删串。之后的任务就是求单词数了。令s[i,j]
文档评论(0)