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.
浙公网安备 33010602011771号