简单题意:
从数字塔的塔尖的第一个数走到最下面所能得到的最大的数字和。
解题思路:
每个父节点会对应两个子节点,自下向上,父节点的值加上两个子节点中较大的一个的值,那么此时这最后一行的父节点又会是上一行的子节点,上一行的父节点再选这一行的子节点中较大的相加(也是最后一行的父节点)。因为每次都是选取的最大的子节点的值相加,那么当到达数塔塔尖的父节点时,它的值必定是最大。
代码如下:
#include <stdio.h>
#include <string.h>
int a[105][105];
int d[105][105];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
scanf("%d",&a[i][j]);
}
}
int i,j;
for(i=1;i<=n;i++)
{
d[n][i]=a[n][i];
}
for(i=n-1;i>=1;i--)
{
for(j=1;j<=i;j++)
{
d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]);
}
}
printf("%d\n",d[1][1]);
}
return 0;
}