问题描述: | 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶 至底的一条路径,使该路径经过的数字总和最大。 7 | |
编程任务: | 对于给定的由n行数字组成的数字三角形,编程计算从三角形的顶至底的路径经过的数字和 的最大值。 | |
数据输入: | 输入的第1行是数字三角形的行数n,1≤n≤100。接下来n行是数字三角形各行中的数字。所 有数字在0..99之间。 | |
结果输出: | 输出到的第1行中的数是计算出的最大值。 | |
样例: | 5 | 30 |
核心思想: | f[i,j]=max{f[i-1,j],f[i-1,j-1]}+a[i,j] 走到第i行j列时的最优值,可倒着来 |
var
f,a:array[0..110,0..110]of longint;
n,i,j,ans:longint;
function max(a,b:longint):longint;
begin
ifa>b then exit(a);
exit(b);
end;
begin
assign(input,'p36.in');reset(input);
assign(output,'p36.out');rewrite(output);
readln(n);
fori:=1 to n do
begin
for j:=1 to i do
read(a[i,j]);
readln;
end;
fillchar(f,sizeof(f),0);
f[1,1]:=a[1,1];
fori:=2 to n do
forj:=1 to i do
f[i,j]:=max(f[i-1,j],f[i-1,j-1])+a[i,j];
fori:=1 to n do
ans:=max(ans,f[n,i]);
writeln(ans);
close(input);close(output);
end.
题目来源:《算法设计与分析》第三章动态规划