动态规划基础PPT

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有一个数字三角形,编程求从最顶层到最底层的一条路所经过位 置上数字之和的最大值。每一步只能向左下或右下方向走。下图数据 的路应为7->3->8->7->5,和为30。 输入: 7 第一行:R(1<=R<=100),数字三角形共有R行; 3 8 以下R行:依次表示数字三角形中每行中的数字。 每个数都是非负的,且<=100. 8 1 0 输出:一个正整数,路径上数字之和的最大值。 2 7 4 4 输入样例: 4 5 2 6 5 5 7 38 810 2744 45265 输出样例: 30
算法5:
var n,i:integer; a,b,c:qword; begin readln(n); a:=1; b:=2; for i:=1 to n-2 do begin c:=a+b; a:=b; b:=c; end; writeln(c); end.
算法2—算法5:
重复的部分只计算一次
【引例2、数字三角形(IOI’94)】
开始时:dfs(a[1,1],1,1);
结果:max
为什么当n较大时速度慢?
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
算法2:
//f:array[0..100,0..100] of integer; //f[I,j] : (I,j) 到最后一行的最大值
function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end; Procedure dfs(i,j:integer);//求(i,j)到最后一行的最大和 begin if i=n then begin f[i,j]:=a[i,j]; exit; end; if f[i,j]>0 then exit; dfs(i+1,j); dfs(i+1,j+1); f[i,j]:=max(f[i+1,j],f[i+1,j+1])+a[i,j]; end; Begin init; dfs(1,1); writeln(f[1,1]); End.
算法1:深度优先搜索算法DFS:
二维数组a[i,j]存储数字三角形。 Procedure dfs(sum,i,j:integer); {从a[1,1]到走到第i行第j列即a[I,j]时所取得的值为sum} begin if i=n then begin if sum>max then max:=sum; exit; end; dfs(sum+a[i+1,j],i+1,j); {向左下方走} dfs(sum+a[i+1,j+1],i+1,j+1); {向右下方走} end;
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
算法3:
方法1:从最后一行向起点走//逆向 设F[I,j]:a[i,j]到达第n行a[n,k](k:1--n)的最大值. 递推关系: 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]
算法2:Fra Baidu bibliotek
const maxn=90; var n:integer; f:array[1..maxn] of qword; function dp(i:integer):qword; begin if i=1 then exit(1); if i=2 then exit(2); if f[i]>0 then exit(f[i]); dp:=dp(i-1)+dp(i-2); f[i]:=dp; end; Begin fillchar(f,sizeof(f),0); readln(n); writeln(dp(n)); end.
内容:
引例
动态规划的概念与原理
例题分析
一、引例
【引例1、上楼梯】
一个含有n阶的楼梯,一次可以走1步或2步, 从底走到顶一共有几种走法? 3<=n<=90。 ( 4660046610375530309: qword)
f(1)=1 f(2)=2 f(n)=f(n-1)+f(n-2)
算法1:
var n:integer; //n<=90 function dp(i:integer):qword; begin if i=1 then exit(1);//begin dp:=1;exit;end if i=2 then exit(2); dp:=dp(i-1)+dp(i-2); end; begin readln(n); writeln(dp(n)); end.
f[5] f[4]
f(1)=1 ; f(2)=2 f(n)=f(n-1)+f(n-2)
算法3:
const maxn=90; var n:integer; f:array[1..maxn] of qword; procedure dp(i:integer); begin if i=1 then begin f[i]:=1; exit; end; if i=2 then begin f[i]:=2; exit; end; if f[i]>0 then exit; dp(i-1); dp(i-2); f[i]:=f[i-1]+f[i-2]; end; begin readln(n); dp(n); writeln(f[n]); end.
思考: 1、算法1与算法2那个更好? 2、为什么?
算法1:
f[4] f[2] f[1] f[3] f[2]
f[6]
f[5] f[3] f[1] f[2] f[2] f[1] f[4] f[3] f[2]
f(1)=1 ; f(2)=2 f(n)=f(n-1)+f(n-2)
算法2:
f[6]
f[4] f[2] f[1] f[3] f[2] f[3]
算法4:
const maxn=90; var n:integer; f:array[1..maxn] of qword; procedure dp; var i:integer; begin f[1]:=1; f[2]:=2; for i:=3 to n do f[i]:=f[i-1]+f[i-2]; end; begin readln(n); dp; writeln(f[n]); end.
相关文档
最新文档