var i,j,t,n:integer;
a:array [1..maxline,1..maxline] of integer;
function try(i,j:integer):integer;
begin
if i=n
then try:=a[i,j]
else if try(i+1,j)>try(i+1,j+1)
then try:=try(i+1,j)+a[i,j]
else try:=try(i+1,j+1)+a[i,j]
end;
begin
readln(n);
for i:=1 to n do
begin
for j:=1 to i do
begin
read(a[i,j])
end;
writeln
end;
writeln(try(1,1))
end.
能否用动规来做?是否符合动规解题的条件:最优化原理和无后效性原则
阶段:按行来化分阶段,如 n 行,可分为 n-1 个阶段,阶段的划分要符合动态规划的两条件,本题如
果按列来划分阶段就不一定符合动态规划的两条件。
状态:各阶段开始时的客观条件称之为状态。每个阶段都有一个状态集,如例题 1 中,
S1={B1,B2},如本题中每一行的数字就是一个状态,如 S2={3,8},状态是阶段的属性,每个阶段的状
态都是由以前阶段变化而来的,这种变化称之为状态转移。
决策:当各段的状态取定后,就可以作出不同的决策,从而确定下一阶段的状态,称之为决策。(例
1,例 2)
状态转移方程(动态规划的核心)
2.2 怎样用动态规划法解题0
1.逆推法:
按三角形的行划分阶段,若行数为0
n,则可把问题看做一个 n-1 个阶段的决
策问题。先求出第 n-1 阶段(第 n-1 行上
各点)到第 n 行的的最大和,再依次求出
第 n-2 阶段、第 n-3 阶段……第 1 阶段(起始点)各决策点至第 n 行的最佳路径。
设:f[i,j]为从第 i 阶段中的点 j 至第 n 行的最大的数字和,状态转移方程为:
则: f[n,j]=a[n,j] 1<=j<=n
f[i,j]=max{a[i,j]+f[i+1,j],a[i,j]+f[i+1,j+1]} 1<=j<=i,1<=i<=n-1
f[1,1]即为所求。0
评论0
最新资源