2. 顺推法
按三角形的行划分阶段,若行数为0n,则可把问题看做一个 n-1 个阶段的决策问题。先求第 2 行各
元素到起点的最大和,再依次求出第 3,4,5,......,.n-1,n 到起点的最大和,最后找第 n 行的最大值设 f[i,j]
为0第 i 行第 j 列上点到起点的最大和,状态转移方程为:
则0f[1,1]=a[1,1];
f[i,1]=a[i,1]+f[i-1,1];
f[i,j]=max{ a[i,j]+f[i-1,j-1],a[i,j]+f[i-1,j]} 2<=j<=i
max(f[n,1],f[n,2],.......,f[n,n]}即为所
求。
思考 1:动态规划为什么快。
空间换时间,把中间过程保存下来,
但有时空间费用太大,怎样压缩空间,只需定义一个一维数组,边读边保存。
上例中的状态转移方程为(顺推):f[j] 表
示第 i 行第 j 个位置上的数到顶点的最大值。
F[j]=max{a[j]+f[j-1],a[j]+f[j]}
2<=j<i
F[1]=a[1]+f[1]
for i:=2 to n do
begin
for j:=1 to i do
read(a[j]);
for j:=i downto 2 do
if f[j-1]>f[j] then f[j]:=a[j]+f[j-1]
else f[j]:=a[j]+f[j];
f[1]:=a[1]+f[1];
end;
思考二:如何保存路径(倒推法,采用未压缩
空间方式来完成)。
如输入:0
5
7
3 8
8 1 0
2 7 7 4
4 5 2 6 5
输出:
30
7->3->8->7->5
分析,用一个数组来表示方向,可定义 0 表示向下,1 表示斜下,反之也可。
思考三:如何完成如下输入的最大值。
5
7
3 8