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

学习目标:

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


学习内容:

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


题目描述

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

给出的三角形如下:
[[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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值