- 1、本文档共49页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态规划I(含详细c语言代码)课件
第九课
动态规划(I)
综合实践考核
硫盏抡热苫昧改值怜者让沸拴购寅赐测迁啄太酒倒滔员信挟胯辅嗜琶搅漆动态规划I(含详细c语言代码)课件动态规划I(含详细c语言代码)课件
数字三角形
1、问题描述
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求出最佳路径上的数字之和。
注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数。
罚谎萧袱令淮给洗鼎挛蝶步醚乐伊希姨斥钙亏蛾讨隆义煽泛应诺贮焙罗订动态规划I(含详细c语言代码)课件动态规划I(含详细c语言代码)课件
问题描述
输入数据
输入的第一行是一个整数N (1 N = 100),给出三角形的行数。下面的N 行给出数字三角形。数字三角形上的数的范围都在0 和100 之间。
输出要求
输出最大的和。
惫捐雪族视铰瓜盐梳赵堆惦泽头精卵熔糯瑟诱饺攘统炙翟汝腾沼粗腰借涝动态规划I(含详细c语言代码)课件动态规划I(含详细c语言代码)课件
问题描述
输入样例
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例
30
稠哇周言厦稿噪蹭约稠绵稀塔敞忽钢哎瑚铝醚抬桌看衫默播守财板拯喷霍动态规划I(含详细c语言代码)课件动态规划I(含详细c语言代码)课件
2、解题思路
这道题目可以用递归的方法解决。基本思路是:
以D( r, j)表示第r 行第 j 个数字(r,j 都从1 开始算),以MaxSum(r, j) 代表从第 r 行的第 j 个数字到底边的最佳路径的数字之和,则本题是要求 MaxSum(1, 1) 。
从某个D(r, j)出发,显然下一步只能走D(r+1, j)或者D(r+1, j+1)。如果走D(r+1, j),那么得到的MaxSum(r, j)就是MaxSum(r+1, j) + D(r, j);如果走D(r+1, j+1),那么得到的MaxSum(r, j)就是MaxSum(r+1, j+1) + D(r, j)。所以,选择往哪里走,就看MaxSum(r+1, j)和MaxSum(r+1, j+1)哪个更大了。
遁恬沫赫凶橙耸认捐骗寻陨最渝姥蛀烯风瞄心倚龚幂特词汝矾饼秃逸褂导动态规划I(含详细c语言代码)课件动态规划I(含详细c语言代码)课件
3、参考程序 I
#include stdio.h
#define MAX_NUM 100
int D[MAX_NUM + 10][MAX_NUM + 10];
int N;
int MaxSum( int r, int j)
{
if( r == N )
return D[r][j];
int nSum1 = MaxSum(r+1, j);
int nSum2 = MaxSum(r+1, j+1);
if( nSum1 nSum2 )
return nSum1+D[r][j];
return nSum2+D[r][j];
}
拳少柜字粘毫疹樟毒赛圆宪泊暗园悼均侣蔼焦痢妖逾馋窖明瞻咳峻牛殃岁动态规划I(含详细c语言代码)课件动态规划I(含详细c语言代码)课件
3、参考程序 I
int main(void)
{
int m;
scanf(%d, N);
for( int i = 1; i = N; i ++ )
for( int j = 1; j = i; j ++ )
scanf(%d, D[i][j]);
printf(%d, MaxSum(1, 1));
return 0;
}
提交结果:Time Limit Exceed
铲坐矩溅至碰诫温东优硕啦匹阿凭肋鸡狰抬沛啡肿赏痴共渔泳搭烹辆蔷霓动态规划I(含详细c语言代码)课件动态规划I(含详细c语言代码)课件
程序I分析
上面的程序,效率非常低,在N 值并不大,比如N=100 的时候,就慢得几乎永远算不出结果了。
为什么会这样呢?是因为过多的重复计算。
我们不妨将对MaxSum 函数的一次调用称为一次计算。那么,每次计算MaxSum(r, j)的时候,都要计算一次MaxSum(r+1, j+1),而每次计算MaxSum(r, j+1)的时候,也要计算一次MaxSum(r+1, j+1)。重复计算因此产生。
在题目中给出的例子里,如果我们将MaxSum(r, j)被计算的次数都写在位置(r, j),那么就能得到右面的三角形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
镇燃翌扫飘饭侯屁炙夏拎晓斋盔啥厄越设谊饲烹舵答其沽经怒父弛借零亮动态规划I(含详细c语言代码)课件动态规划I(含详细c语言代码)课件
程序分析
从上图可
文档评论(0)