算法之挖地雷问题.docVIP

  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文档。上传文档
查看更多
算法之挖地雷问题 一、问题陈述 在一条河上有若干个地雷坑,每个地雷坑中埋有一定数量的地雷,地雷坑的编号为1、2、3、…、N(N=100),如下表所示(N=10): 地雷坑号 1 2 3 4 5 6 7 8 9 10 地雷数量 8 14 2 17 33 26 15 17 19 6 同时在每个地雷坑中都有一张说明书(除最后一个地雷坑以外)。说明书指出,在挖完此坑的地雷之后,还可以继续挖哪些坑。 挖地雷的规则为可以从任何一个地雷坑开始,到任何一个地雷坑结束。同时,在挖完某个地雷坑中的地雷之后,可以选择它可继续挖的地雷坑之一继续挖,但只能选择一种。 例如:从1坑开始,可挖到8枚地雷,挖完之后继续挖2号地雷坑,挖完之后,可挖到14枚。挖完2坑之后,还可以挖3号地雷坑,可挖到2枚。由于3号坑之后不存在链接,因此挖地雷结束。按照上面的方法,从1号地雷坑开始,到3号地雷坑结束,总共可挖到地雷数量为8+14+2=24枚。同时,我们看到在挖完1号地雷坑中的地雷之后,可以选择4号地雷坑,在挖完4号地雷坑之后可以选择5号坑继续挖,在挖完5号坑之后可以选择6号坑继续挖,在挖完6号坑之后可以选择8号坑继续挖,在挖完8号坑之后可继续挖10号坑,在挖完10号坑之后,挖地雷结束。此时总共可挖地雷数量为8+17+33+26+17+6=107。 问题为:当地雷坑中的地雷数量以及后继关系给出之后,找出一个挖地雷的方法,能挖到最多的地雷。 二、动态规划基本思想 动态规划算法通常用于求解具有某种最优性质的问题。在问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。用动态规划求解的问题,经分解得到子问题往往不是互相独立的。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。 三、算法描述 1、用动态规划求解: (1)由后往前查找: 若从第n个地雷坑开始挖,此时可能得到a(n)枚地雷。 若从第n-1个地雷坑开始挖,此时有2种可能: ①第n-1个到第n个地雷坑无法走通(可由r(n-1,n)判断),此时可挖a(n-1)枚。 ②第n-1个到第n个地雷坑可以走通,则可挖a(n-1)+a(n)枚。 一般情况,若从第i个地雷坑开始挖,根据关系r,找出i后面的所有可以走通的地雷坑,从中找出一条可挖最多地雷的路线,这样可得到最多的挖地雷数。 (2)上面计算出从每个地雷坑开始能挖到最多的地雷数,此时找出一个最大值即可 2、地雷堆之间的联系可用以下的数组表示: 二维整数型数组r[i][j]表示,当r[i][j]=1表示从i到j的地雷坑可以走通,当r[i][j]=0表示从i到j的地雷坑走不通。例子中r[i][j]表示如下: i j 1 2 3 4 5 6 7 8 9 10 1 0 1 0 1 1 0 1 0 0 0 2 0 1 0 1 1 0 0 0 0 3 0 0 0 0 0 0 0 0 4 0 1 1 0 0 0 0 5 0 1 1 1 0 0 6 0 0 1 1 0 7 0 1 1 1 8 0 1 1 9 0 0 10 0 四、程序代码 1、程序输入 按照提示第一行输入地雷坑的个数,第二行输入地雷坑中地雷个数,之间用空格隔开。第三行按照表格输入从第i行第i个地雷坑开始到第i行最后地雷坑是否可以走通,1表示走的通,0表示走不通,之间用空格,输入完第i行回车输入i+1行数据。直到最后一行。 程序代码 #includeiostream.h #define max 100//定义最大地雷坑数 int main() { //初始化 int a[max]={0};//记录地雷坑地雷个数 int r[max][max]={0};//r[i][j]记录从i到j地雷坑是否走的通 int b[max][3]={0};//b[][1]记录挖出雷德总数,b[][2]记录挖出雷位置 int i,j,h,cmax; int n; //数据输入 cout请输入地雷坑的个数:; cinn; cout请输入地雷坑里雷的个数:; for(i=1;i=n;i++) { cina[i]; } for(i=1;i=n;i++) { for(j=i;j=n;

文档评论(0)

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

1亿VIP精品文档

相关文档