动态规划-石子归并.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文档。上传文档
查看更多
动态规划-石子归并

动态规划实例:石子归并 一.题目描述: 在一个圆形操场的四周摆放着N堆石子(N=100),现要将石子有次序地合并成一堆. 规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数记为该次合并的得分. 编写一程序,读入堆栈数N及每堆栈的石子数(=20). (1)选择一种合并石子的方案,使用权得做N-1次合并,得分的总和最小; (2)选择一种合并石子的方案,使用权得做N-1次合并,得分的总和最大; ? 输入数据: 第一行为石子堆数N; 第二行为每堆的石子数,每两个数之间用一个空格分隔. ? 输出数据: 从第一至第N行为得分最小的合并方案. 第N+1行是空行.从第N+2行到第2N+1行是得分最大合并方案. 每种合并方案用N行表示,其中第i行(1=i=N)表示第i次合并前各堆的石子数(依顺时针次序输出,哪一堆先输出均可). 要求将待合并的两堆石子数以相应的负数表示. ? 输入输出范例: 输入: 4 4 5 9 4 ? 输出: -4 5 9 -4 -8 -5 9 -13 -9 22 ? 4 -5 -9 4 4 -14 -4 -4 -18 22 ? 二.算法分析: 竞赛中多数选手都不约而同地采用了尽可能逼近目标的贪心法来逐次合并: 从最上面的一堆开始,沿顺时针方向排成一个序列. 第一次选得分最小(最大)的相邻两堆合并,形成新的一堆; 接下来,在N-1堆中选得分最小(最大)的相邻两堆合并……,依次类推,直至所有石子经N-1次合并后形成一堆. 例如有6堆石子,每堆石子数依次为3 4 6 5 4 2. 要求选择一种合并石子的方案,使得做5次合并,得分的总和最小. ? 按照贪心法,合并的过程如下: 每次合并得分: 第一次合并 3 4 6 5 4 2 ??5 第二次合并 5 4 6 5 4 ??9 第三次合并 9 6 5 4 ??9 第四次合并 9 6 9 ??15 第五次合并 15 9 ??24 24 总得分=5+9+9+15+24=62 ? 但是当我们仔细琢磨后,可得出另一个合并石子的方案: 每次合并得分: 第一次合并 3 4 6 5 4 2 ??7 第二次合并 7 6 5 4 2 ??13 第三次合并 13 5 4 2 ??6 第四次合并 13 5 6 ??11 第五次合并 13 11 ??24 24 总得分=7+13+6+11+24=61 ? 显然,后者比贪心法得出的合并方案更优. 题目中的示例故意造成一个贪心法解题的假象,诱使读者进入“陷阱”. 为了帮助读者从这个“陷阱”里走出来,我们先来明确一个问题: 1.最佳合并过程符合最佳原理 使用贪心法之所以可能出错,是因为每一次选择得分最小(最大)的相邻两堆合并,不一定保证余下的合并过程能导致最优解. 聪明的读者马上会想到一种理想的假设: 如果N-1次合并的全局最优解包含了每一次合并的子问题的最优解,那么经这样的N-1次合并后的得分总和必然是最优的. 例如上例中第五次合并石子数分别为13和11的相邻两堆. 这两堆石头分别由最初的第1,2,3堆(石头数分别为3,4,6)和第4,5,6堆(石头数分别为5,4,2)经4次合并后形成的. 于是问题又归结为如何使得这两个子序列的N-2 次合并的得分总和最优. 为了实现这一目标,我们将第1个序列又一分为二: 第1、2堆构成子序列1,第3堆为子序列2. 第一次合并子序列1中的两堆,得分7; 第二次再将之与子序列2的一堆合并,得分13. 显然对于第1个子序列来说,这样的合并方案是最优的. 同样,我们将第2个子序列也一分为二: 第4堆为子序列1,第5,6堆构成子序列2. 第三次合并子序列2中的2堆,得分6; 第四次再将之与子序列1中的一堆合并,得分13. 显然对于第二个子序列来说,这样的合并方案也是最优的. 由此得出一个结论: 6堆石子经过这样的5次合并后,得分的总和最小. 我们把每一次合并划分为阶段,当前阶段中计算出的得分和作为状态,如何在前一次合并的基础上定义一个能使目前得分总和最大的合并方案作为一次决策. 很显然,某阶段的状态给定后,则以后各阶段的决策不受这阶段以前各段状态的影响. 这种无后效性的性质符最佳原理,因此可以用动态规划的算法求解. ? 2.动态规划的方向和初值的设定 采用动态规划求解的关键是确定所有石子堆子序列的最佳合并方案. 这些石子堆子序列包括: {第1堆、第2堆}、{第2堆、第3堆}、……、{第N堆、第1堆}; {第1堆、第2堆、第3堆}、{第2堆、第3堆、第4堆}、……、{第N堆、第1堆、第2堆} …… {第1堆、……、第N堆}、{第2堆、……、第N堆、第1堆}、……、{第N堆、第1堆、……、第N-1堆} 为了便于运算,我们用(i,j)表示一个从第i堆数起,顺时针数j堆时的子序列{第i堆、第i+1堆、……、第(i+j-1)mo

文档评论(0)

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

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

版权声明书
用户编号:7065136142000003

1亿VIP精品文档

相关文档