数塔问题
(numtri.pas/c/cpp)
来源:IOI94
【问题描述】
写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步可以走到左下方的点也可以到达右下方的点。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
【输入文件】
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。
【输出文件】
【输入样例】
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
【输出样例】
30
========================
============================
{
ID:jie19952
PROG:numtri
LANG:PASCAL
}
var
r:longint;
a:array[1..1000,1..1000]of longint;
f:array[1..1001,1..1001]of longint;
procedure init;
begin
assign(input,'numtri.in');
assign(output,'numtri.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
function max(a,b:int64):int64;
begin
if a>b then exit(a);
exit(b);
end;
procedure main;
var
i,j:longint;
begin
readln(r);
for i:=1 to r do
for j:=1 to i do
read(a[i,j]);
fillchar(f,sizeof(f),0);
for i:=r downto 1 do
for j:=1 to i do
begin
f[i,j]:=max(f[i+1,j],f[i+1,j+1])+a[i,j];
end;
writeln(f[1,1]);
end;
begin
init;
main;
terminate;
end.