程序设计方法——动态规划法.pptxVIP

  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文档。上传文档
查看更多
《程序设计实践》程序设计方法之动态规划任务:5/JudgeOnline/showproblem?problem_id=1104摘桃子(5/JudgeOnline/showproblem?problem_id1长满桃子的树很大,共有n层(最高层为第1层),第i层有i条树枝,树的形状呈一个三角形(如图)图中的点表示树枝,每个点上方的数字表示这条树枝最多能摘到的桃子数在摘得某枝条的桃子之后,小猴子只能选择往左上方爬或者是往右上方爬例如:摘了有6个桃子的树枝之后只能摘有2个桃子的树枝或是有3个桃子的树枝),然后继续摘桃子。??23645小猴子现在想要从最低层开始一直爬到树顶(也就是最上面的那个枝条),摘尽可能多的桃子。请你编程帮他解决这个问题。解题思路题目似曾相识??滑雪、迷宫…可以用递归回溯方法解决建议自写递归回溯的代码换一种思路A:1B:2C:3E:6D:4F:5第2阶段第1阶段第0阶段从最低一层爬到最顶点,经过的路径上数字之和最大思路先看第2阶段,到达顶点有2条路B?A,可以摘到1个桃子,则经过B点到顶点最多摘得桃子数是:到达B点手中最多的桃子数+1C?A,可以摘到1个桃子,则经过C点到顶点最多摘得桃子数是:到达C点手中最多的桃子数+1从上述两条路径中选择一条最优的令令P(X)表示从底层到X点可以摘到最多桃子数目,包含X点可以摘到的桃子数目则:P(A) = max{P(B),P(C)}+1思路(续)而第1阶段的P(B) = max{P(D), P(E)}+2P(C) = max{P(E), P(F)}+3按照题意,P(D),P(E),P(F)分别初始化为4, 6, 5上述递推公式说明,要求P(A)需要先求出阶段1的P(B)和P(C),而要得到P(B)和P(C),需要知道P(D),P(E),P(F)思路(续)显然,根据前面的递推过程求解,需要倒过来,从P(D),P(E),P(F)出发,先求出第1阶段的P(B)和P(C),最后得到P(A)。数据结构将长满桃子的树用二维数组保存数组行上存放桃树上一层中每个树枝上桃子数将节点上桃子数目存放在数组中只使用数组中对角线及下部分A:1C:9B:21297652364F:5D:7E:6J:4G:2I:6H:3问题分析从二维数组最下面一行开始向上一行沿图中的直线前进,走到左上角的格子停止。行走路径上经过的格子中的数字之和是猴子爬到树顶能拿到桃子的数目,我们定义为路径长度。原问题转化为求所有路径中路径长度的最大值。1297652364问题分析(续)按照前面的思路,最长路径的长度是:P(A) = max{P(B), P(C)}+1P(B) = max{P(D), P(E)}+2P(C) = max{P(E), P(F)}+9P(D) = max{P(G), P(H)}+7P(E) = max{P(H), P(I)}+6P(F) = max{P(I), P(J)}+5P(G) = 2, P(H) = 3, P(I) = 6, P(J) = 4将底层到每个点的最长路径P也存放在二维数组中y1297652364ACBxDEFGJHI数据结构(续)#define MAXLAYER 3int peachtree[MAXLAYER][MAXLAYER] = { {1, -1, -1, -1}, {2, 9, -1, -1}, {7, 6, 5, -1}, {2, 3, 6, 4} };int P[MAXLAYER][MAXLAYER]原问题转化为即求P[0][3]P[x][ y] = max{P[x][ y-1], P[x+1][y-1]}+peachtree[x][y]y 0, x + y = MAXLAYPER注意边界条件,P[x][ 0] = peachtree[x][0]1297652364yx最多能摘到22个桃子,路径如上图红色箭头所示参考程序如下#include stdio.h#include stdlib.h#include iostreamusing namespace std;#define MAXLAYER 110int maxnum(int x, int y) //返回2个整数中的大者{ if (x y) return x; else return y;}参考程序(续)int main(){ int peachtree[MAXLAYER][MAXLAYER]; int P[MAXLAYER][MAXLAYER]; int i, j, k, n; //读入数据 cin n; k = 1; //当前这层的节点数目 for (i = 0; i n; i++) // n-i层的的节点 { for (j = 0; j k; j++) { cin peachtree[j

文档评论(0)

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

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

1亿VIP精品文档

相关文档