day02 898 数字三角形 (动态规划)

本文解析了一道关于寻找数字三角形中路径和最大值的编程题,通过动态规划方法解决,重点在于理解边界条件并运用向上爬的策略。实例演示了如何使用Java计算给定三角形的路径和最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

898 数字三角形

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

        7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5
输入格式

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

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

输出格式

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

数据范围

1≤n≤5001≤n≤5001n500
−10000≤三角形中的整数≤10000−10000≤三角形中的整数≤100001000010000

输入样例:
5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5
输出样例:
30
题目需要注意的点

这道题我认为最容易错的点就是边界问题。

一般就是就是向下走,和向上爬两种思路,向上爬的思路可以不需要考虑边界问题。

而当向下走的时候,需要考虑边界问题。如输入样例中第二行的8,只能从左上角的7下来,右上角没有数。处理起来要考虑的东西多很多,因此我们选择向上爬的思路。

import java.util.Scanner;

public class Main {
   public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[][] arr = new int[n][n];//三角形矩阵,用n*n存储,多出的默认是0
        int[][] dp  = new int[n][n];//dp矩阵,存储从底部到三角形矩阵每个点的所有路径的最大值
        for(int i = 0;i < n;i++){
            for(int j = 0;j <= i;j++ ){
                arr[i][j] = scanner.nextInt();
            }
        }
        //初始化dp,dp从底部开始,故dp[n-1][i] = arr[n-1][i]
        for(int i = 0;i < n;i++){
            dp[n-1][i] = arr[n-1][i];
        }
        for(int i = n-2;i >= 0;i--){
            for(int j = 0;j < arr[i].length - 1;j++){
                dp[i][j] = Math.max(dp[i+1][j],dp[i+1][j+1]) + arr[i][j];
            }
        }
        System.out.println(dp[0][0]);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值