算法训练 数字三角形

经过这一阵努力的学习,我的C++基础总算学完了,可以开始自己刷题了,前天朋友给了我几道题,让我帮他看看,我也是很兴奋,跃跃欲试,可是我看到题时,我傻眼了,在我之前做过这道题,可是我没有做出来,怎么办?
其实我没有想怎么办,只是当机立断的接了下来,因为我是个很逗比的人,自己遇见很难得题,就懒得去多想,可是当别人问我时,虚荣的我就会绞尽脑汁去思考,有了压力,我的大脑也更加活跃,总是可以解决我本以为自己解决不了的问题。于是,我就跟朋友说,交给我吧,等我有时间了尽快给你答复。
接着,我就开始对这道题展开了新一轮的攻势……

问题描述:

                                    7
                                 3     8 
                              8     1     0 
                           2     7     4     4 
                        4     5     2     6     5

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每一条路径,把路径上的数字加起来可以得到一个和,和的最大路径称为最佳路径。你的任务就是求出最佳路径上的数字和。
注意:路径上的每一步只能从一个数走到下一层上和它最邻近的左边的数或者右边的数。

输入格式
文件中首先读到的是三角形的行数。
接下来描述整个三角形

输出格式
最大总和(整数)

样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出
30

#include <stdio.h>
int main(int argc, const char * argv[])
{
    int SanJiaoXing[5050]={0},Sum[5050]={0},n=0,i=0,j=0;
    scanf("%d",&n);
    for (; i<(1+n)*n/2; i++)
    {
        scanf("%d",&SanJiaoXing[i]);
    }
    for (i=n*(n-1)/2; i<(1+n)*n/2; i++)
    {
        Sum[i]=SanJiaoXing[i];
    }
    j=n-1;
    for (i=n*(n-1)/2-1; i>=0; i--)
    {
        if ((j+1)*j/2-1-i==j)
        {
            j--;
        }
        Sum[i]=SanJiaoXing[i]+(Sum[i+j]>Sum[i+j+1]?Sum[i+j]:Sum[i+j+1]);
    }
    printf("%d\n",Sum[0]);
    return 0;
}

这个方法虽然是做出来了,但是做过这个题后我感觉代码真心好难理解,直观性很差,别人看会很难看懂,于是我就又改写了代码,把一维数组改为二维数组做了一遍,结果依然正确,挺好的。但是这两种办法会所占的内存和时间差距不大,所以依个人感觉,用二维数组解题会比用一维数组更加好点,因为代码更加直观。代码如下:

#include <stdio.h>
int main()
{
    int SanJiaoXing[100][100]={0},Sum[100][100]={0};
    int n=0,i=0,j=0;
    scanf("%d",&n);
    for (; i<n; i++)
    {
        for (j=0; j<=i; j++)
        {
            scanf("%d",&SanJiaoXing[i][j]);
        }
    }
    for (i=0; i<n; i++)
    {
        Sum[n-1][i]=SanJiaoXing[n-1][i];
    }
    for (i=n-2; i>=0; i--)
    {
        for (j=0; j<=i; j++)
        {
            Sum[i][j]=SanJiaoXing[i][j]+(Sum[i+1][j]>Sum[i+1][j+1]?Sum[i+1][j]:Sum[i+1][j+1]);
        }
    }
    printf("%d\n",Sum[0][0]);
    return 0;
}    

  最后,送给自己一句话:成就感来源于克服困难!(☆_☆)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值