数据结构与算法方格取数.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
方格取数 (一)问题描述 设有N*N的方格图(N≤8),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例): 向右 A 1 2 3 4 5 6 7 8 1 0 0 0 0 0 0 0 0 2 0 0 13 0 0 6 0 0 3 0 0 0 0 7 0 0 0 4 0 0 0 14 0 0 0 0 向 下 5 0 21 0 0 0 4 0 0 6 0 0 15 0 0 0 0 0 7 0 14 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 B 某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。 此人从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大。 输 入 输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。 输 出 只需输出一个整数,表示2条路径上取得的最大的和。 样 例 输入 8 2 3 13 2 6 6 3 5 7 4 4 14 5 2 21 5 6 4 6 3 15 7 2 14 0 0 0 输出 67 问题分析 本题是从1997年国际信息学奥林匹克的障碍物探测器一题简化而来,如果人只能从A点到B点走一次,则可以用动态规划算法求出从A点到B点的最优路径。具体的算法描述如下:从A点开始,向右和向下递推,依次求出从A点出发到达当前位置(i,j)所能取得的最大的数之和,存放在sum数组中,原始数据经过转换后用二维数组data存储,为方便处理,对数组sum和data加进零行与零列,并置它们的零行与零列元素为0。易知 sum[i,j]= data[i,j] 当i=0或j=0 sum[i,j]= max(sum[i-1,j],sum[i,j-1])+ data[i,j] 当i>0,且j>0 求出sum数组以后,通过倒推即可求得最优路径,具体算法如下: 置sum数组零行与零列元素为0 for i:=1 to n do for j:=1 to n do if sum[i-1,j]>sum[i,j-1] then sum[i,j]:=sum[i-1,j]+data[i,j] else sum[i,j]:=sum[i,j-1]+data[i,j]; i:=n; j:=n; while (i>1) or (j>1) do if (i>1) and (sum[i,j]=sum[i-1,j]+data[i,j]) then begin data[i,j]:=-1; i:=i-1 end else begin data[i,j]:=-1; j:=j-1 end; data[1,1]:=-1; 凡是被标上-1的格子即构成了从A点到B点的一条最优路径。 那么是否可以按最优路径连续走两次而取得最大数和呢?这是一种很自然的想法,并且对样例而言也是正确的,具体算法如下: 求出数组sum, s1:=sum[n,n], 求出最优路径, 将最优路径上的格子中的值置为0, 将数组sum的所有元素置为0, 第二次求出数组sum, 输出s1+sum[n,n]。 虽然这一算法保证了连续的两次走法都是最优的,但却不能保证总体最优,相应的反 例也不难给出,请看下图: 图二按最优路径走一次后,余下的两个数2和3就不可能同时取倒了,而按图三中的非最优路径走一次后却能取得全部的数,这是因为两次走法之间的协作是十分重要的,而图2中的走法并不能考虑全局,因此这一算法只能算是“贪心算法”。虽然在一些情况下,贪心算法也能够产生最优解,但总的来说“贪心算法”是一种有明显缺陷的算法。 既然简单的动态规划行不通,那么看看穷举行不行呢?因为问题的规模比较小,启发我们从穷举的角度出发去思考,首先让我们来看看N=8时,从左上角A到达右下角B的走法共有多少种呢?显然从A点到B点共需走14步,其中向右走7步,向下走7步,共有=34

文档评论(0)

today-is-pqsczlx + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档