第9章--第3节-动态规划经典题(C++版)教案.pptVIP

第9章--第3节-动态规划经典题(C++版)教案.ppt

  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文档。上传文档
查看更多
第9章--第3节-动态规划经典题(C版)教案

14、滑雪(ski.pas) 【问题描述】 小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次走上坡或等着直升机来载他,小明想知道在一个区域中最长的滑坡。滑坡的长度由滑过点的个数来计算,区域由一个二维数组给出,数组的每个数字代表点的高度。下面是一个例子: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小,在上面的例子中,一条可行的滑坡为25-24-17-16-1(从25开始到1结束),当然25-24……2…1更长,事实上这是最长的一条。 【输入格式】 输入的第一行为表示区域的二维数组的行数R和列数C(1≤R、C≤100)下面是R行,每行有C个数代表高度。 【输出格式】 输出区域中最长的滑坡长度。 [i-1,j]↓ [i,j-1]→ [i,j] ←[i,j+1] [i+1,j]↑ * 【样例输入】 3 5 7 23 –5 –24 16 5 21 -4 10 23 -21 5 -4 -20 20 【样例输出】 53 2 4 5 * 【解法一】 【算法分析】 问题实际就是给定F束花和V个花瓶,以及各束花放到不同花瓶中的美学值,要求你找出一种摆放的方案,使得在满足编号小的花放进编号小的花瓶中的条件下,美学值达到最大。 将问题进行转化,找出问题的原型。首先,看一下上述题目的样例数据表格。 将摆放方案的要求用表格表现出来,则摆放方案需要满足:每行选且只选一个数(花瓶);摆放方案的相邻两行中,下面一行的花瓶编号要大于上面一行的花瓶编号两个条件。这时可将问题转化为:给定一个数字表格,要求编程计算从顶行至底行的一条路径,使得这条路径所经过的数字总和最大(要求每行选且仅选一个数字)。同时,路径中相邻两行的数字,必须保证下一行数字的列数大于上一行数字的列数。 看到经过转化后的问题,发现问题与“数学三角形”问题十分相似,数字三角形问题的题意是: 给定一个数字三角形,要求编程计算从顶至底的一条路径,使得路径所经过的数字总和最大(要求每行选且仅选一个数字)。同时,路径中相邻两行的数字,必须保证下一行数字的列数与上一行数字的列数相等或者等于上一行数字的列数加1。 上例中已经知道:数字三角形中的经过数字之和最大的最佳路径,路径的每个中间点到最底层的路径必然也是最优的,可以用动态规划方法求解,对于“花店橱窗布置”问题经过转化后,也可采取同样的方法得出本题同样符合最优性原理。因此,可以对此题采用动态规划的方法。 * 【参考程序】 #includeiostream #includecstring #includecstdio using namespace std; int main() { int a[101][101],b[101][101],c[101][101],d[101]; //a[i][j] 花束i放在花瓶j中的美学值 //b[i][j] 前i束花放在前j个花瓶中的最优解 //c[i][j] 在b[i][j]的最优解中,花束i-1的位置 int f,v,i,j,k,max; //f , v 花束和花瓶的数目 cinfv; for (i=1;i=f;i++) for (j=1;j=v;j++) cina[i][j]; memset(b,128,sizeof(b)); //这样处理,可以保证每束花都放进花瓶 for (i=1;i=v-f+1;i++) //初始化第1束花放在第i个花瓶的情况 b[1][i]=a[1][i]; for (i=2;i=f;i++) for (j=i;j=v-f+i;j++) for (k=i-1;k=j-1;k++) //枚举花束i-1的位置 if (b[i-1][k]+a[i][j]b[i][j]) { b[i][j]=b[i-1][k]+a[i][j

文档评论(0)

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

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

1亿VIP精品文档

相关文档