石子合并问题报告.docx

上传人:b****5 文档编号:3161496 上传时间:2022-11-18 格式:DOCX 页数:9 大小:20.51KB
下载 相关 举报
石子合并问题报告.docx_第1页
第1页 / 共9页
石子合并问题报告.docx_第2页
第2页 / 共9页
石子合并问题报告.docx_第3页
第3页 / 共9页
石子合并问题报告.docx_第4页
第4页 / 共9页
石子合并问题报告.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

石子合并问题报告.docx

《石子合并问题报告.docx》由会员分享,可在线阅读,更多相关《石子合并问题报告.docx(9页珍藏版)》请在冰豆网上搜索。

石子合并问题报告.docx

石子合并问题报告

石子合并(动态规划)详细解题报告

2007-02-2514:

58

一.试题

     在一个园形操场的四周摆放N堆石子(N≤100),现要将石子有次序地合并成一堆。

规定

     每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。

     编一程序,由文件读入堆数N及每堆的石子数(≤20),

     ①选择一种合并石子的方案,使得做N-1次合并,得分的总和最小;

     ②选择一种合并石子的方案,使得做N-1次合并,得分的总和最大。

     例如,所示的4堆石子,每堆石子数(从最上面的一堆数起,顺时针数)依

     次为4594。

则3次合并得分总和最小的方案:

8+13+22=43

     得分最大的方案为:

14+18+22=54

     输入数据:

     文件名由键盘输入,该文件内容为:

     第一行为石子堆数N;

     第二行为每堆的石子数,每两个数之间用一个空格符分隔。

     输出数据:

     输出文件名为output.txt

     从第1至第N行为得分最小的合并方案。

第N+1行是空行。

从第N+2行到第2N+1行是得

     分最大合并方案。

     每种合并方案用N行表示,其中第i行(1≤i≤N)表示第i次合并前各堆的石子数(依

     顺时针次序输出,哪一堆先输出均可)。

要求将待合并的两堆石子数以相应的负数表示,以便标识。

     输入输出范例:

     输入文件内容:

     4

     4594

     输出文件内容:

     -459-4

     -8-59

     -13-9

     22

      

     4-5-94

     4-14-4

     -4-18

     22

     二.算法分析

     竞赛中多数选手都不约而同地采用了尽可能逼近目标的贪心法来逐次合并:

从最上面

     的一堆开始,沿顺时针方向排成一个序列。

第一次选得分最小(最大)的相邻两堆合并,

     形成新的一堆;接下来,在N-1堆中选得分最小(最大)的相邻两堆合并……,依次类推,

     直至所有石子经N-1次合并后形成一堆。

     例如有6堆石子,每堆石子数(从最上面一堆数起,顺时针数)依次为346542

     要求选择一种合并石子的方案,使得做5次合并,得分的总和最小。

     按照贪心法,合并的过程如下:

     每次合并得分

     第一次合并346542->5

     第二次合并54654   ->9

     第三次合并9654      ->9

     第四次合并969         ->15

     第五次合并159          ->24

     24

     总得分=5+9+9+15+24=62

     但是当我们仔细琢磨后,可得出另一个合并石子的方案:

     每次合并得分

     第一次合并346542 ->7

     第二次合并76542    ->13

     第三次合并13542     ->6

     第四次合并1356        ->11

     第五次合并1311         ->24

     24

     总得分=7+6+11+13+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)modn堆}

     它的最佳合并方案包括两个信息:

     ①在该子序列的各堆石子合并成一堆的过程中,各次合并得分的总和;

     ②形成最佳得分和的子序列1和子序列2。

由于两个子序列是相邻的,因此只需记住子序列1的堆数;

     设

     f〔i,j〕──将子序列〔i,j〕中的j堆石子合并成一堆的最佳得分和;

     c〔i,j〕──将〔i,j〕一分为二,其中子序列1的堆数;

     (1≤i≤N,1≤j≤N)

     显然,对每一堆石子来说,它的

     f〔i,1〕=0

     c〔i,1〕=0(1≤i≤N)

     对于子序列〔i,j〕来说,若求最小得分总和,f〔i,j〕的初始值为∞;若求最大得分总和,f〔i,j〕的初始值为0。

(1≤i≤N,2≤j≤N)。

     动态规划的方向是顺推(即从上而下)。

先考虑含二堆石子的N个子序列(各子序列分别从第1堆、第2堆、……、第N堆数起,顺时针数2堆)的合并方案

     f〔1,2〕,f〔2,2〕,……,f〔N,2〕

     c〔1,2〕,c〔2,2〕,……,c〔N,2〕

     然后考虑含三堆石子的N个子序列(各子序列分别从第1堆、第2堆、……、第N堆数起,顺时针数3堆)的合并方案

     f〔1,3〕,f〔2,3〕,……,f〔N,3〕

     c〔1,3〕,c〔2,3〕,……,c〔N,3〕

     ……

     依次类推,直至考虑了含N堆石子的N个子序列(各子序列分别从第1堆、第2堆、……、第N堆数起,顺时针数N堆)的合并方案

     f〔1,N〕,f〔2,N〕,……,f〔N,N〕

     c〔1,N〕,c〔2,N〕,……,c〔N,N〕

     最后,在子序列〔1,N〕,〔2,N〕,……,〔N,N〕中,选择得分总和(f值)最小(或最大)的一个子序列〔i,N〕(1≤i≤N),由此出发倒推合并过程。

     3.动态规划方程和倒推合并过程

     对子序列〔i,j〕最后一次合并,其得分为第i堆数起,顺时针数j堆的石子总数t。

被合并的两堆石子是由子序列〔i,k〕和〔(i+k-1)mod

     n+1,j-k〕(1≤k≤j-1)经有限次合并形成的。

为了求出最佳合并方案中的k值,我们定义一个动态规划方程:

     当求最大得分总和时

     f〔i,j〕=max{f〔i,k〕+f〔x,j-k〕+t}

     1≤k≤j-1

     c〔i,j〕=k│f〔i,j〕=f〔i,k〕+f〔x,j-k〕+t

     (2≤j≤n,1≤i≤n)

     当求最小得分总和时

     f〔i,j〕=min{f〔i,k〕+f〔x,j-k〕+t}

     1≤k≤j-1

     c〔i,j〕=k│f〔i,j〕=f〔i,k〕+f〔x,j-k〕+t

     (2≤j≤n,1≤i≤n)

     其中x=(i+k-1)modn+1,即第i堆数起,顺时针数k+1堆的堆序号。

     例如对上面例子中的6(346542)堆石子,按动态规划方程顺推最小得分和。

依次得出含二堆石子的6个子序列的合并方案

     f〔1,2〕=7f〔2,2〕=10f〔3,2〕=11

     c〔1,2〕=1c〔2,2〕=1c〔3,2〕=1

     f〔4,2〕=9f〔5,2〕=6f〔6,2〕=5

     c〔4,2〕=1c〔5,2〕=1c〔6,2〕=1

     含三堆石子的6(346542)个子序列的合并方案

     f〔1,3〕=20f〔2,3〕=25f〔3,3〕=24

     c〔1,3〕=2c〔2,3〕=2c〔3,3〕=1

     f〔4,3〕=17f〔5,3〕=14f〔6,3〕=14

     c〔4,3〕=1c〔5,3〕=1c〔6,3〕=2

     含四堆石子的6(346542)个子序列的合并方案

     f〔1,4〕=36f〔2,4〕=38f〔3,4〕=34

     c〔1,4〕=2c〔2,4〕=2c〔3,4〕=1

     f〔4,4〕=28f〔5,4〕=26f〔6,4〕=29

     c〔4,4〕=1c〔5,4〕=2c〔6,4〕=3

     含五堆石子的6(346542)个子序列的合并方案

     f〔1,5〕=51f〔2,5〕=48f〔3,5〕=45

     c〔1,5〕=3c〔2,5〕=2c〔3,5〕=2

     f〔4,5〕=41f〔5,5〕=43f〔6,5〕=45

     c〔4,5〕=2c〔5,5〕=3c〔6,5〕=3

     含六堆石子的6(346542)个子序列的合并方案

     f〔1,6〕=61f〔2,6〕=62f〔3,6〕=61

     c〔1,6〕=3c〔2,6〕=2c〔3,6〕=2

     f〔4,6〕=61f〔5,6〕=61f〔6,6

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1