数字三角形的动态规划的解法

动态规划求解三角形最大路径和
本文介绍了一种使用动态规划算法求解数字三角形中从顶到底的最大路径和的方法,避免了传统递归的高时间复杂度,通过自底向上更新每个节点的最大路径值,最终得出最优解。

1. 问题描述:

在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大
路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径

三角形的行数大于1小于等于100,数字为 0 - 99<br>
输入格式:

5 (表示三角形的行数 )

(接下来输入三角形)
       7
     3 8
    8 1 0
   2 7 4 4
  4 5 2 6 5
 要求输出最大和

2. 下面我们使用耗时更少的动态规划来进行解决,之前我们是写过普通的递归,无返回值的深度优先搜索,有返回值的深度优先搜索,记忆型的递归(有返回值的深搜)对于其中思路会比较熟悉了,这里我们使用动态规划来解决使用到另外一个思路就是谁依赖于谁,那么我们就先求解出被依赖的那个量,对于这道题目来说,上面的顶点依赖于下面的顶点,所以需要先求解出下层的这些顶点然后进行逐步逼近要求解的最大值

因为是动态规划,所以我们一定要保存历史上的最佳结果,所以使用一个二维数组来进行保存下层节点的最大值然后往上层的节点进行更新那么最后得到的顶点那么就是所有路径中的最大值了,我们可以使用excel表来帮助我们理解

3. 具体的代码如下:

import static java.lang.Math.max;
import java.util.Scanner;
public class Main {
    static int triangle[][];
    static int n;
    static int rec[][];
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        triangle = new int[n][];
        rec = new int[n][];
        for(int i = 0; i < n; i++){
            triangle[i] = new int[i + 1];
            rec[i] =  new int[i + 1];
            for(int j = 0; j <= i; j++){
                triangle[i][j] = sc.nextInt();
            }
        }
        int res = dp();
        System.out.println(res);
        sc.close();
    }
    
    private static int dp(){
        int row = triangle.length;
        //初始化最后一行
        for(int i = 0; i < row; i++){
            rec[row - 1][i] = triangle[row - 1][i];
        }
        for(int i = row - 2; i >= 0; i--){
            for(int j = 0; j <= i; j++){
                //进行更新每一个顶点
                rec[i][j] = triangle[i][j] + max(rec[i + 1][j], rec[i + 1][j + 1]);
            }
        }
        return rec[0][0];
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值