蓝桥云科——505题

题目描述

蓝桥云科——505题_第1张图片

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

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

输入描述

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

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

输出描述

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

输入输出样例

示例

输入

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

输出

27

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

题目分析:

        (1)每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数,不要看数学三角形三角形,看输入格式,输入格式就是三角形的储存格式,对于数学三角形说的最近左边或者右边,对输入格式来说,最近左边就是下一层和它一样的列,最近右边就是下一层它的列数加一,那么对于一个数来说,到它这里的最大路径应该加上他上一层的左边和右边的最大值。对于每一个都采用这种计算方法,那么当我们算到最后一层的时候,每个数记录的就是从头到它这里的最大路径。

        (2)最重要的是题目说:向左下走的次数与向右下走的次数相差不能超过 1(这里是说总共走的次数,而不是说向左走一步下一步就要向右走)。这就产生了一个规律:当最后层数是偶数时,你到达最后一层的位置一定是中间的两个位置中的一个(因为你开始的时候可以选择向左或者向右,所以产生了两种可能)。

                当最后层数是奇数时,最后到达的位置一定是最中间那个位置

代码:

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int triangle[][] = new int[n][n];//用来记录三角形各个位置的初始值

        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                triangle[i][j]  = sc.nextInt();
            }
        }

        for (int i = 0; i < n -1; i++) {
            for (int j = 0; j <= i; j++) {
                if(j-1<0){//判断是不是最左边的位置,因为最左边的位置只能由上一层和它同一列走到
                    triangle[i+1][j] += triangle[i][j];
                }
                else {
                    //其余位置的数可以由上一层的同列或者列数减一走到,选择其中最大的路径
                    triangle[i+1][j] += Math.max(triangle[i][j],triangle[i][j-1]);
                }
                //最右边的位置只能由它上一层的列数减一走来
                if(j==i)triangle[i+1][j+1] += triangle[i][j];
            }
        }
    
        //判断最后一层层数是奇是偶
        if(n%2==0)
            System.out.println(Math.max(triangle[n-1][n/2],triangle[n-1][n/2 -1]));
        else System.out.println(triangle[n-1][n/2]);
        
        sc.close();
    }
}

你可能感兴趣的:(算法,数据结构)