数字三角形

题目描述


图片描述

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。

路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。

输入描述

输入的第一行包含一个整数 N\ (1 \leq N \leq 100)N (1N100),表示三角形的行数。

下面的 NN 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。

输出描述

输出一个整数,表示答案。

输入输出样例

示例

输入

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
27
运行限制
  • 最大运行时间:1s
  • 最大运行内存: 256M
    #include<stdio.h>
    int max(int a, int b)//取最大值;
    {
        if (a > b)
            return a;
        else
            return b;
    }
    int main()
    {
        int n, i, j;
        scanf("%d", &n);
        int a[100][100], b[100][100];
        for (i = 1; i <= n; i++)//将图形中的数字存入数组中;
            for (j = 1; j <= i; j++)
            {
                scanf("%d", &a[i][j]);
            }
    //以下代码目的为让三角形中的数字都加上上一层对应的数!
        b[1][1] = a[1][1];
        for (i = 2; i <= n; i++)
            for (j = 1; j <= i; j++)
            {
                if (j == 1)//当该数字位于行首是,只用加上上一行第一个;
                    b[i][j] = b[i - 1][j] + a[i][j];
                else if (j == i)//当行尾时,只能加上一行行尾;
                    b[i][j] = b[i - 1][j - 1] + a[i][j];
                else//当处于中间时,挑中间较大者相加;
                    b[i][j] = max(b[i - 1][j - 1], b[i - 1][j]) + a[i][j];
            }
    //可以知道:由于左右的次数不能大于1,所以当n为奇数时,结果只能走到中间那个;当n为偶数时,结果可以走到中间两个,结果为较大者。
        if (n % 2 == 0)
            printf("%d", max(b[n][n / 2], b[n][n / 2 + 1]));
        else
            printf("%d", b[n][n / 2 + 1]);
        return 0;
    }

     

    Description

     

    给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。

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

     

    Input

     

    第一行包含整数n,表示数字三角形的层数。

    接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。

    1 \leq n \leq 5001n500

    -500 \leq500≤三角形中的数字\leq 500500

     

    Output

     

    输出一个整数,表示最大的路径数字和。

     

    输入样例 1 

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

    输出样例 1

    30
     
     和上一题差不多,区别在于数组大小和向左向右次数不定
    #include<stdio.h>
    int max(int a, int b)
    {
        return a > b ? a : b;
    }
    int main()
    {
        int n, i, j;
        scanf("%d", &n);
        static int a[500][500], b[500][500];//vs 中数组达到上限,在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
        for (i = 1; i <= n; i++)
            for (j = 1; j <= i; j++)
            {
                scanf("%d", &a[i][j]);
            }
        b[1][1] = a[1][1];
        for(i=2;i<=n;i++)
        {
            for (j = 1; j <= i; j++)
            {
                if (j == 1)
                    b[i][j] = b[i - 1][j] + a[i][j];
                else if (j == i)
                    b[i][j] = b[i - 1][j - 1] + a[i][j];
                else
                    b[i][j] = max(b[i - 1][j], b[i - 1][j - 1]) + a[i][j];
    
            }
        }
        int sum = b[n][1];
        for (j = 1; j <= n; j++)
        {
            if (sum < b[n][j])
                sum = b[n][j];
        }
        printf("%d", sum);
        return 0;
    }

     

     
posted @ 2022-02-16 20:59  lvxinnnnnn  阅读(102)  评论(0)    收藏  举报