题目描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(图一)
图一表示一个5行的数字三角形。假设给定一个n行数字三角形,计算出从三角形顶至底的一条路径,使该路径经过的数字总和最大。
每一步只能由当前位置向下或向右下。
输入
你的程序要能接受标准输入。第一行包含一个整数T,表示总的测试次数。
对于每一种情况:第一行包含一个整数N,其中1 < N < 100,表示三角形的行数。
接下来的N行输入表示三角形的每一行的元素Ai,j,其中0 < Ai,j < 100。
输出
输出每次测试的最大值并且占一行。
样例输入
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
#include<stdio.h>
int judgeMax(int a,int b)
{
return a>b?a:b;
}
int main()
{
int t,n;
int i,j,ma;
int s[105][105]={0},dp[105][105]={0};
scanf("%d",&t);
while(t--)
{
ma = -1;
scanf("%d",&n);
for(i = 0;i < n;i ++)
{
for(j = 0;j < i+1;j ++)
{
scanf("%d",&s[i][j]);
if(i > 0)
{
if(j > 0 && j < i)
dp[i][j] = s[i][j] + judgeMax(dp[i-1][j-1],dp[i-1][j]);
else if(j > 0)
dp[i][j] = s[i][j] + dp[i-1][j-1];
else if(j < i)
dp[i][j] = s[i][j] + dp[i-1][j];
else
dp[i][j] = s[i][j];
}
else
dp[i][j] = s[i][j];
if(ma < dp[i][j])
ma = dp[i][j];
}
}
printf("%d\n",ma);
}
return 0;
}