ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:361.60KB ,
资源ID:5674327      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5674327.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(石子合并问题报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

石子合并问题报告.docx

1、石子合并问题报告石子合并 ( 动态规划 )详细解题报告 2007-02-25 14:58试题在一个园形操场的四周摆放 N堆石子(NW 100),现要将石子有次序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。编一程序,由文件读入堆数 N及每堆的石子数(20),选择一种合并石子的方案,使得做 N- 1次合并,得分的总和最小;选择一种合并石子的方案,使得做 N- 1次合并,得分的总和最大。例如,所示的4堆石子,每堆石子数(从最上面的一堆数起,顺时针数)依次为4 5 9 4。则3次合并得分总和最小的方案:8+13 + 22=43输入数据:第二行为每堆的

2、石子数,每两个数之间用一个空格符分隔。输出数据: 输出文件名为 output.txt从第1至第N行为得分最小的合并方案。第 N+ 1行是空行。从第N+ 2行到第2N+ 1行是得分最大合并方案。每种合并方案用 N行表示,其中第i行(1 i 第二次合并 5第三次合并 9-第四次合并 9第五次合并 1-2 424总得分=5 + 9 + 9 + 15+24=62但是当我们仔细琢磨后,可得出另一个合并石子的方案:每次合并得分第一次合并 3- 7第二次合并 7- 1 3第三次合并 1- 6第四次合并 1- 1 1第五次合并 1-2 4总得分=7 + 6+11 + 13 + 24 = 6 1最佳合并过程符合

3、最佳原理使用贪心法至所以可能出错,例如上例中第五次合并石子数分别为13和11的相邻两堆。为如何使得这两个子序列的 N2次合并的得分总和最优。为了实现这一目标,我们将第1个序列又一分为二:第1、2堆构成子序列1,第3堆为子序列2。第一次合并子序列1中的两堆,得分7;合并方案也是最优的。过这样的5次合并后,得分的总和最小。我们把每一次合并划分为阶段,当前阶段中计算出的得分和作为状态,很显然, 某阶段的状态给定后, 则以后各阶段的决策不受这阶如何在前一次合并的基础上定义一个能使目前得分总和最大的合并方案作为一次决策。段状态的影响。这种无后效性的性质符最佳原理,因此可以用动态规划的算法求解。2 .动态

4、规划的方向和初值的设定这些石子堆子序列包括:采用动态规划求解的关键是确定所有石子堆子序列的最佳合并方案。它的最佳合并方案包括两个信息:在该子序列的各堆石子合并成一堆的过程中,各次合并得分的总和;因此只需记住子序列1的堆数; 形成最佳得分和的子序列1和子序列2。由于两个子序列是相邻的,ci , j 将i , j一分为二,其中子序列1的堆数;显然,对每一堆石子来说,它的f i ,1=0c i ,1=0 (1 w i w N)对于子序列i , j来说,若求最小得分总和,fi , j的初始值为 若求最大得分总和,f i , j的初始值为0。(1 i N,2 Wj N)、第 N 堆数起,顺时针数2堆)的

5、合动态规划的方向是顺推(即从上而下)。先考虑含二堆石子的 N个子序列(各子序列分别从第1堆、第2堆、f 1,2, f2,2, f N,2、第N堆数起,顺时针数3堆)的合并方案然后考虑含三堆石子的N个子序列(各子序列分别从第1堆、第2堆、,f N,3、第N堆数起,顺时针数 N堆)的合并方案依次类推,直至考虑了含 N堆石子的N个子序列(各子序列分别从第1堆、第2堆、过程。f 1, N, f2,c 1, N, c2,最后,在子序列1,N,N,N,2, f N, N, c N, N, N, N, N中,选择得分总和(f值)最小(或最大)的一个子序列i , N(1 W i N),由此出发3动态规划方程和

6、倒推合并过程当求最大得分总和时f i , j= max f i , k+ f x, j-k+ tc i , j= kf i , j= f i , k+ f x, j-k+ t(2jn,1i 7c1,3= 2可知由子序的最小值,表明最小得分和是由序列1,6经5次合并得出的。我们从这个序、3 和子序列4, 3经4次合并后得出。其中I 2= 1 ,以表明了子序列1 , 2的合并方案是第1堆合并第2堆。- 13第二次合并 7 6子序列1,3经2次合并后合并成1堆,2次合并的得分和=7+13 = 20。c4,3=1,可知由子序列4,3合并成的一堆石子是由第4堆和子序列5,2合并而来的。而c5,2= 1,

7、又表明了子序列5,2的合并方案是第5堆合并第6堆。由此倒推回去,得出第3、第4次合并的方案每次合并得分:第三次合并42- 6- 11第四次合并子序列4,3经2次合并后合并成1堆,2次合并的得分和=6+11=17。第五次合并是将最后两堆合并成1堆,该次合并的得分为24。显然,上述5次合并的得分总和为最小20+17+24=61procedure print beginif j1 then 继续倒推合并过程begin print ( i , c i , j;倒推子序列1的合并过程 print ( i + c i ,j 1 mod n+1, j c i ,j )for K : = 1 toNdo 输出

8、当前被合并的两堆石子if (第K堆石子未从圈内去除)then begin if (K= i ) or ( K= X) then置第K堆石子待合并标志 else第K堆石子未被合并;end ; then 第i堆石子数J第i堆石子数+第 X堆石子数;将第X堆石子从圈内去除; then print 调用print (Cl, 6)后的结果如下:printprint( 1,2) print( 3, 1 )print(图 6.2-5 )(1,6)print (4,3)print( 4, 1) print( 5,2)3print显示 3显示7显示 1显示 1显示 1注:调用print过程后,应显示6堆石子的总

9、数作为第5次合并的得分。Program Stones;TypeNode = Record当前序列的合并方案 c : Longint; 得分和d : Byte 子序列1的堆数End;SumType = Array 1 .100,1 .100 of Longint;sumtypei,j- 子序列ij 的石子总数VarList: Array 1 .100,1 .100 of Node;子序列ij 的合并方案Date, Dt: Array 1.100 of Integer;Sum : ASumType;sum件i,j- 指向子序列i,j 的石子总数的指针F : Text; 文件变量 Fn : Stri

10、ng; 文件名串 VarBeginFor k := 1 to N Do 输出当前合并第 i 堆, 第 x 堆石子的方案 If Datek 0 Then BeginIf (i= k)or(x=k)Then Write(F, - Datek, )Else Write(F, Datek, )End; Then Writeln(F); 输出换行符 Datei := Datei + Datex;原第i堆和第x堆合并成第i堆End Then End; Print Procedure Main(s : Shortint);Vari, j, k : Integer;t, x : Longint;BeginFo

11、r i := 1 to N Do Begin仅含一堆石子的序列不存在合并 Listi, 1.c := 0;Listi, 1.d := 0End; ForFor j := 2 to N DoFor i := 1 to N Do Begin顺推含2堆,含3堆含N堆石子的各子序列的合并方案 当前考虑从第 i 堆数起 , 顺时针数 j 堆的子序列 If s = 1 Then Listi, j.c := Maxlongint 合并 i,j 子序列的得分和初始化 t := Sum仲,j;Else Listi, j.c := 0;最后一次合并的得分为 i,j 子序列的石子总数 For k := 1 to j

12、 - 1 Do Begin子序列1的石子堆数依次考虑 1堆j-1堆x := (i + k - 1) Mod N + 1;求子序列 2 首堆序号 If (s=1) And (Listi,k.c + Listx,j-k.c+t Listi, j.c) 若该合并方案为目前最佳 , 则记下 Then BeginListi, j.c := Listi, k.c + Listx, j - k.c + t;Listi, j.d := kEnd Then End For End; For 在子序列 1,N,2,N,N, N 中选择得分总和最小 ( 或最大 ) 的一个子序列 k := 1; x := List1

13、, N.c;For i := 2 to N DoIf (s = 1) And (Listi, N.c x) Then Begink := i; x := Listi, N.cEnd; Then Print(k, N); 由此出发 , 倒推合并过程 Writeln(F, Sum件1, N);输出最后一次将石子合并成一堆的石子总数 Writeln(F);Writeln(listk, N.c)End; Main BeginReadln(Fn);Assign(F, Fn); 该文件名串与文件变量连接 Reset(F); 文件读准备 读入每堆石子数 Readln(F, N); 读入石子堆数 For i

14、:= 1 to N Do Read(F, Datei);New(Sum); 求每一个子序列的石子数 sumFor i := 1 to N Do Sum件i, 1 := Datei;For j := 2 to N DoFor i := 1 to N DoSum件i, j := Datei + Sum仲 Mod N + 1, j - 1;Dt := Date; 暂存合并前的各堆石子 ,结构相同的变量可相互赋值 Close(F); 关闭输入文件 Assign(F, OUTPUT.TXT); 文件变量与输出文件名串连接 Rewrite(F);文件写准备 Main(1); 求得分和最小的合并方案 Date := Dt; 恢复合并前的各堆石子 Main(2); 求得分和最大的合并方案 Close(F) 关闭输出文件 End.

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

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