数塔问题(numtri.pas/c/cpp)

数塔问题

(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

【输入文件】

    第一个行包含 R(1<= R<=1000) ,表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

所有的被供应的整数是非负的且不大于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.


 

你可能感兴趣的:(NOIP2011黎明前夕的黑暗,动态规划,usaco,output,pascal,input)