问题描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
图中给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数。
输入形式
输入的是一行是一个整数N (1 < N <= 100),给出三角形的行数。下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。
输出形式
输出最大的和。
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
乍一看很简单的一道题,其实可以引申为求完全二叉树的权值问题。
该题的思路就是枚举,只不过如果从上到下的话并不利于统计,而且最大路径的可能性还没有办法周全地考虑到,所以合适的方法是从下往上寻找最大路径。枚举最下面一行的各个数,以它们为起点,逐步向上,这样判断上面的两个数哪个较大就很容易了。越往上可能性越少,当找到第一个数时,循环结束,用一个数组存储这个路径即可。最后对该组各节点的路径比较,得出最大路径。
代码如下:
#include <stdio.h>
int main() {
int a[101][101]={0},num[101]={0};
int n,i,j,y,max;
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=n-1;i>=0;i--)
{
y=i;
num[i]=a[n-1][i];
for(j=n-2;j>=0;j--)
{
if(a[j][y]>=a[j][y-1])
{
num[i]+=a[j][y];
}
else
{
num[i]+=a[j][y-1];
y--;
}
}
}
max=num[0];
for(i=1;i<n;i++) if(num[i]>max) max=num[i];
printf("%d",max);
// for(i=0;i<n;i++) printf("%d ",num[i]);
return 0;
}
亲测可行。