欢迎来到天天文库
浏览记录
ID:50175735
大小:45.50 KB
页数:16页
时间:2020-03-06
《石子合并问题报告.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、石子合并(动态规划)详细解题报告2007-02-2514:58一.试题 在一个园形操场的四周摆放N堆石子(N≤100),现要将石子有次序地合并成一堆。规定 每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 编一程序,由文件读入堆数N及每堆的石子数(≤20), ①选择一种合并石子的方案,使得做N-1次合并,得分的总和最小; ②选择一种合并石子的方案,使得做N-1次合并,得分的总和最大。 例如,所示的4堆石子,每堆石子数(从最上面的一堆数起
2、,顺时针数)依 次为4594。则3次合并得分总和最小的方案:8+13+22=43 得分最大的方案为:14+18+22=54 输入数据: 文件名由键盘输入,该文件内容为: 第一行为石子堆数N; 第二行为每堆的石子数,每两个数之间用一个空格符分隔。 输出数据: 输出文件名为output.txt 从第1至第N行为得分最小的合并方案。第N+1行是空行。从第N+2行到第2N+1行是得 分最大合并方案。 每种合并方案用N行表示,其中第i行
3、(1≤i≤N)表示第i次合并前各堆的石子数(依 顺时针次序输出,哪一堆先输出均可)。要求将待合并的两堆石子数以相应的负数表示,以便标识。 输入输出范例: 输入文件内容: 4 4594 输出文件内容: -459-4 -8-59 -13-9 22 4-5-94 4-14-4 -4-18 22 二.算法分析 竞赛中多数选手都不约而同地采用了尽可能逼近目标的贪心法来逐次合并:从最上面
4、 的一堆开始,沿顺时针方向排成一个序列。第一次选得分最小(最大)的相邻两堆合并, 形成新的一堆;接下来,在N-1堆中选得分最小(最大)的相邻两堆合并……,依次类推, 直至所有石子经N-1次合并后形成一堆。 例如有6堆石子,每堆石子数(从最上面一堆数起,顺时针数)依次为346542 要求选择一种合并石子的方案,使得做5次合并,得分的总和最小。 按照贪心法,合并的过程如下: 每次合并得分 第一次合并346542->5 第二次合并54654 -
5、>9 第三次合并9654 ->9 第四次合并969 ->15 第五次合并159 ->24 24 总得分=5+9+9+15+24=62 但是当我们仔细琢磨后,可得出另一个合并石子的方案: 每次合并得分 第一次合并346542 ->7 第二次合并76542 ->13 第三次合并13542 ->6 第四次合并1356 ->11 第五次合并1311
6、 ->24 24 总得分=7+6+11+13+24=61 显然,后者比贪心法得出的合并方案更优。题目中的示例故意造成一个贪心法解题的 假像,诱使读者进入“陷阱”。为了帮助读者从这个“陷阱”里走出来,我们先来明确一个问题: 1.最佳合并过程符合最佳原理 使用贪心法至所以可能出错, 是因为每一次选择得分最小(最大)的相邻两堆合并,不一定保证余下的合并过程能导致最优解。聪明的读者马上会想到一种理想的假设:如果N-1次合并的全局最优解包含了每一次合并的子问题
7、的最优解,那么经这样的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的一堆合并,得分1
8、3。显然对于第1个子序列来说,这样的合并方案是最优的。同样,我们将第2个子序列也一分为二;第4堆为子序列1,第5,6堆构成子序列2。第三次合并子序列2中的2堆,得分6;第四次再将之与子序列1中的一堆合并,得分13。显然对于第二个子序列来说,这样的合并方案也是最优的。 由此得出一个结论──6堆石子经 过这样的5次合并后,得分的总和最小。我们把每一次合并划分为
此文档下载收益归作者所有