数字三角形 —— java蓝桥杯(简单)

题目描述

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。

输入描述

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

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

输出描述

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

输入输出样例

示例

 

 

复制代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[][] arr = new int[N][N];
        int[][] dp = new int[N][N];
        for(int i=0;i<N;i++) {
            for(int j=0;j<=i;j++) {
                arr[i][j] = sc.nextInt();    //设置每行依次按行数接收数字个数
            }
        }                                    //接收输入的数字三角形
        sc.close();
        dp[0][0] = arr[0][0];
        for(int i=1;i<N;i++) {                //为什么要从1开始?
            dp[i][0] = dp[i-1][0] + arr[i][0];        //为什么要相加啊? 将第一列之和存储到一个二维数组的第一列
        }
        for(int i=1;i<N;i++) {                //之所以从1开始,是因为入口只有一个 
            for(int j=1;j<=i;j++) {
                dp[i][j] = arr[i][j] + Math.max(dp[i-1][j], dp[i-1][j-1]);        //Math.max(数组) 筛选出数组中最大的数字并返回   
                                                //为什么会有dp[i][j]=arr[i][j]+Math.max(dp[i-1][j],dp[i-1][j-1])选取上一排最大的邻接最大的数
            }
        }
       //为什么不能将dp【0】【0】与其他合在一起? 因为要返回上一层 dp【i-1】【j-1】会超出数组范围出现dp【-1】【-1】
       //怎么解决向左下和右下走的次数相差不能超过1? 数字三角形 入口 —— 出口 奇数取中间 偶数取中间两个数最大值
        if(N%2!=0) {
            System.out.println(dp[N-1][N/2]);        //为什么输入层数为奇数时 此为最大和? 【(奇数 / 2)取小】
        }else {
            System.out.println(Math.max(dp[N-1][N/2], dp[N-1][N/2-1]));
        }
    }
}
复制代码

 

posted @   抹茶泡芙  阅读(248)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示