【算法 动态规划】三角矩阵,给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字

学习目标:

目标:学习动态规划相关知识


学习内容:

本文内容:学习动态规划的思想并使用动态规划解决斐波那契数列、青蛙跳台阶、连续子数组的最大和、拆分语句等相关问题。


题目描述

题目描述
给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字,
例如:

给出的三角形如下:
[[20],
[30,40],
[60,50,70],
[40,10,80,30]]
最小的从顶部到底部的路径和是:
20 +30 + 50 + 10 = 110。

注意:
如果你能只用O(N)的额外的空间来完成这项工作的话,就可以得到附加分,其中N是三角形中的行总数。

解题思路

这个题目是一个动态规划题目,我们需要分析出状态状态转移方程以及初始状态

  • 状态:

根据题目描述,我们需要求出从三角形顶部到底部的最小路径,所以我们的子状态就可以是从(n,n),(n,n-1)…(1,0)(1,1)(0,0)到底部的最小路径和
F(i,j):从(i,j)到三角形底部的最小路径和

  • 状态递归:

F(i,j)=min(F(i+1,j),F(i+1,j+1))+triangle[i] [j]

triangle[i] [j]表示原三角矩阵

  • 初始值:

F(n-1,0) = triangle[n-1][0], F(n-1,1) = triangle[n-1][1],…,F(n-1,n-1) = triangle[n- 1][n-1]

  • 返回结果:

F(0, 0)

实现代码

public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) {
    for(int i=triangle.size()-2;i>=0;i--){
        for(int j=0;j<=i;j++){
            int curMin=triangle.get(i).get(j)+
           			 Math.min(triangle.get(i+1).get(j),triangle.get(i+1).get(j+1));
            triangle.get(i).set(j,curMin);
        }
    }
    return triangle.get(0).get(0);
}
在解决数字三角形问题时,动态规划算法可以有效地找到从顶部底部路径数字最大的一条路径。推荐深入阅读《动态规划算法解析:从数字三角形问题入手》一文,其中详细阐述了动态规划的基本概念、状态转移方程的定义及其在数字三角形问题中的应用。 参考资源链接:[动态规划算法解析:从数字三角形问题入手](https://wenku.youkuaiyun.com/doc/4t9a1t1qoi?spm=1055.2569.3001.10343) 首先,动态规划的思路是自底向上,从数字三角形的最后一行开始,计算一行中每个位置的最大路径,最后得到从顶部底部的最大路径。状态转移方程是解决这类问题的核心,其定义如下: 对于三角形中的任意位置`(i, j)`,其到达该位置的最大路径`f[i, j]`可以通过以下状态转移方程来计算: ``` f[i, j] = max(f[i + 1, j], f[i + 1, j + 1]) + a[i, j] ``` 这里`a[i, j]`表示数字三角形在位置`(i, j)`上的数字值,`f[i + 1, j]``f[i + 1, j + 1]`分别是从位置`(i, j)`向下到下一行左边右边位置的最大路径。通过这样的递推关系,我们可以构建一个二维数组来保存每一步的最大路径动态规划算法的魅力在于其能够高效地解决具有最优子结构重叠子问题的优化问题。除了数字三角形问题,这种算法还可以应用于路径矩阵链乘、背包问题等多种场景。通过学习理解状态转移方程,我们可以将动态规划应用到更广泛的问题中,以实现最优化解决方案。 通过阅读《动态规划算法解析:从数字三角形问题入手》,你可以更深入地理解动态规划算法在解决实际问题中的应用,以及如何构建应用状态转移方程,从而提升你的算法设计最优化问题解决能力。 参考资源链接:[动态规划算法解析:从数字三角形问题入手](https://wenku.youkuaiyun.com/doc/4t9a1t1qoi?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值