数字三角形最大路径

问题描述

               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;
}

亲测可行。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值