USACO-Chapter1-Section 1.5-Number Triangles (numtri)

【题目描述】

      观察下面的数字金字塔。

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

         7 
      3   8 
    8   1   0 
  2   7   4   4 
4   5   2   6   5 

【输入格式】

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

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

所有的被供应的整数是非负的且不大于100。

【输出格式】

单独的一行,包含那个可能得到的最大的和。

【输入样例】

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5 

【输出样例】

30

【思路】

      我想这道题应该是DP的先驱吧,许多教程都把这道题作为DP的切入题,但是我还是认为他是递推毕竟,递推也算是DP吧。废话不多说,每层为一个阶段,每个阶段由上一层得到,转移方程f[i,j]=max(f[i+1,j],f[i+1,j+1])。

【代码】

  • Executing...
  • Test 1: TEST OK [0.000 secs, 8260 KB]
  • Test 2: TEST OK [0.000 secs, 8260 KB]
  • Test 3: TEST OK [0.000 secs, 8260 KB]
  • Test 4: TEST OK [0.000 secs, 8260 KB]
  • Test 5: TEST OK [0.000 secs, 8260 KB]
  • Test 6: TEST OK [0.011 secs, 8260 KB]
  • Test 7: TEST OK [0.043 secs, 8260 KB]
  • Test 8: TEST OK [0.011 secs, 8260 KB]
  • Test 9: TEST OK [0.432 secs, 8260 KB]
  • All tests OK.
{
 ID  : c_CaM.19
 LANG: PASCAL
 TASK: numtri
}
Program CaM(input,output);
Var
  f,a:array[0..1010,0..1010] of longint;
  i,j,n:longint;

Function max(x,y:longint):longint;
Begin
  if x>y then exit(x) else exit(y);
End;

Procedure innt;
Begin
  assign(input,'numtri.in'); reset(input);
  assign(output,'numtri.out'); rewrite(output);
End;

Procedure outt;
Begin
  close(input);
  close(output);
End;

Begin
  innt;
  readln(n);
  for i:=1 to n do
    for j:=1 to i do
    Begin
      read(a[i,j]);
      f[n,j]:=a[i,j];
    End;

  for i:=n-1 downto 1 do
    for j:=1 to i do
      f[i,j]:=max(f[i+1,j],f[i+1,j+1])+a[i,j];

  writeln(f[1,1]);
  outt;
End.
posted @ 2012-03-05 23:52  你滴韩王  阅读(241)  评论(0)    收藏  举报