- 1、本文档共39页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[企业管理]动态规划1
* 动态规划 【引例1、数字三角形】 有一个数字三角形,编程求从最顶层到最底层的一条路所经过位置上数字之和的最大值。每一步只能向左下或右下方向走。下图数据的路应为7-3-8-7-5,和为30。 输入: 第一行:R(1=R=100),数字三角形共有R行; 以下R行:依次表示数字三角形中每行中的数字。 每个数都是非负的,且=100. 输出:一个正整数,路径上数字之和的最大值。 输入样例: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 输出样例: 30 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 一、引例 算法一:深度优先搜索算法DFS: 二维数组a[i,j]存储数字三角形。 Procedure try(sum,i,j:integer); {从a[1,1]到走到第i行第j列即a[I,j]时所取得的值为sum} begin if i=n then begin if summax then max:=sum; exit; end; try(sum+a[i+1,j],i+1,j); {向左下方走} try(sum+a[i+1,j+1],i+1,j+1); {向右下方走} end; 开始时:try(a[1,1],1,1); 结果:max 为什么当n较大时速度慢? 方法一:依次求从起点(1,1)到点(i,j)的最大值。 设F[I,j]为从a[1,1]到达a[I,j]时取得的最大值. 根据题意可得出递推关系: 算法二: f[i,j]=max{f[i-1,j-1]+a[i,j],f[i-1,j]+a[I,j]} 或f[i,j]=max{f[i-1,j-1],f[i-1,j]}+a[I,j] 初始:f[1,1]:=a[1,1]; 目标:max{f[n,i]} 1=i=n procedure work begin f[1,1]:=a[1,1]; for i:=2 to n do {枚举行} for j:=1 to i do {枚举每行的元素} if f[i-1,j-1]f[i-1,j] then f[i,j]:=f[i-1,j-1]+a[i,j] else f[i,j]:=f[i-1,j]+a[i,j]; {枚举两种走法} ans:=f[n,1]; for i:=2 to n do if f[n,i]ans then ans:=f[n,i]; writeln(ans); end; procedure work2;{顺推} begin f[1,1]:=a[1,1]; for i:=2 to n do for j:=1 to i do f[i,j]:=max(f[i-1,j-1],f[i-1,j])+a[i,j]; ans:=f[n,1]; for i:=2 to n do if f[n,i]ans then ans:=f[n,i]; writeln(ans); end; function max(a,b:integer):integer; begin max:=a; if bmax then max:=b; end; 方法二:从最后一行向起点走 设F[I,j]:a[i,j]到达第n行a[n,k](k:1--n)的最大值. 递推关系: f[i,j]=max{f[i+1,j]+a[i,j],f[i+1,j+1]+a[I,j]} 或f[i,j]=max{f[i+1,j],f[i+1,j+1]}+a[I,j] 初始:f[n,i]:=a[n,i]; 1=i=n 目标:f[1,1] {procedure work begin for i:=1 to n do f[n,i]:=a[n,i]; for i:=n-1 downto 1 do {枚举行} for j:=1 to i do {枚举每行的元素} if f[i+1,j]f[i+1,j+1] then f[i,j]:=f[i+1,j]+a[i,j] else f[i,j]:=f[i+1,j+1]+a[i,j]; {枚举走法} writeln(f[1,1]); end; } 思考:算法一和算法二的主要区别在哪里? 算法一:每求一条从起点到终点的路线,中间的点都重新求一遍。做了大量的重复性计算。 算法二:中间结点的值只求一次,后边的点可以直接使用
您可能关注的文档
最近下载
- 国标动力专业图集 - 01(03)R413 室外热力管道安装(架空敷设).pdf
- API 571-2020影响炼油工业固定设备的损坏机理-中文版.pdf
- 中建铁路信用评价管理办法解读.pptx
- 2025年AMC8模拟卷和解析.pdf
- 2024中国工商银行福建分行乡村振兴专项招聘10人笔试备考试题及答案解析.docx VIP
- 《循环小数》跨学科解说(教学设计)-2023-2024学年五年级上册数学人教版.docx VIP
- 14S501单层、双层井盖及踏步(2015年合订本)(OCR).pdf VIP
- 2024年上海市金山区中考英语一模试卷.docx
- 视觉传播传统图形创新设计教学能力比赛教案.pdf
- 2025届高考专题复习:句式变换.pptx VIP
文档评论(0)