#动态规划 LeetCode 120 三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

例如,给定三角形:

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

说明:

如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

思路:

接着上一题的状态转移继续说

  • 动态规划问题,重中之重就是找到状态转移方程,而状态转移方程很重要的一点就是明确函数的意义所在,以及记录结果的数据结构。
  • 比如上一题中的F(n)就是走到第n阶的方法数。我个人更倾向于把它描述为,我们最后一步走到第n阶的全部走法。
  • 而这一题相对就复杂的地方就在于,我们记录结果的数据结构不是一个简单的数字了,而是一个二维的数组(java这里是List<List>)
  • 在问题开始之前,对应的二维数组储存的是从上一节,走到这一节,需要的步数。
  • 我们自上而下 ,开始寻找状态方程很容易想到的是最顶层的走法为F(0,0)= F(1,0)+F(1,1)
  • 本质上状态方程变为F(i,j) = F(i+1 ,j)+F(i+1, j+1),只有这两个位置为相邻的。
  • 得到了状态转移方程我们就可以自底向上开始思考了。F(n-2,0) = F(n-1,0)+ F(n-1,1)。。。
  • 问题的重点来了,这里并不是一个一维的过程,我们需要一个和初始数组类似的二维数组,依次记录结果。我们新的数组的所代表的意义为:从下倒上,走到当前位置所走最少步数。
  • 而我们从下倒上和从上到下的长度是一致的。所以每次遇到新的节点,我们仅仅需要在可以到达他的方法中选取最小结果记录即可。
  • 所以我们使用迭代的方法,自下而上依次遍历并且记录。最后走到顶点的结果即F(0,0)即为所求。
class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int n = triangle.size();
        if(n == 0)
            return 0;

        for(int i = n-1 ; i>=0 ; i--)
            for(int j=0 ; j<triangle.get(i).size(); j++ ){
                if(i!=n-1)
                    triangle.get(i).set(j , (int)Math.min( triangle.get(i+1).get(j),triangle.get(i+1).get(j+1))+triangle.get(i).get(j) );
            }

        return triangle.get(0).get(0);
    }
}

原文地址:https://www.cnblogs.com/rainxbow/p/9695460.html

时间: 2024-08-01 18:55:14

#动态规划 LeetCode 120 三角形最小路径和的相关文章

LeetCode 120——三角形最小路径和

1. 题目 2. 解答 详细解答方案可参考北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分. 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的较小值然后再加上当前元素,即可得出从某一位置到最下边的最小路径和.以此类推,我们就可以求出最上边元素的最小路径和.过程如下所示: 2 3 4 6 5 7 4 1 8 3 第三行到最下边的最小元素和 7 6 10 3 min(4, 1) + 6 min(1, 8) + 5 min(8, 3) + 7

120. 三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11). 说明: 如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分. 逆向思维,从底向顶部找,状态转移方程 minimus[i][j]=data[i][j]+min(minimums[i+1][j]+minimu

数字三角形最小路径和—动态规划

思路:自底向上求解,从倒数第二行开始,本行节点到最后一行的最小路径和等于该节点的数据加上下面左右两个数据中最小的一个.不使用额外空间,直接将最小路径和存储到原有的数组中.1 int minimumTotal(vector<vector<int>> &triangle) { 2 // write your code here 3 for (int i = triangle.size() - 2; i >= 0; i--) { 4 for (int j = 0; j &l

三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11). 说明: 如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分. 1.自顶向下带备忘录的方法 class Solution { private int[][] cache; public int minimu

[Leetcode]120.三角形路径最小和

---恢复内容开始--- 题目的链接 简单的动态规划题,使用了二维dp数组就能很好的表示. 由于有边界的问题,所以这个dp数组为 dp[n+1][n+1]. dp[i][j]意思是终点为(i-1,j-1)点的路径最小和. 我们需要把这个三角形变成方阵来看,先看看样例: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 变成方阵之后就变成了 [ [2, INT_MAX,INT_MAX, INT_MAX], [3,               4,INT_MAX, INT_MAX

【数据结构与算法】动态规划——最小路径和(普通矩阵、三角形两题)

最小路径和 LeetCode:最小路径和 题目描述: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小. 思想: 动态规划,可以用原数组作为dp数组 代码: class Solution { public int minPathSum(int[][] grid) {

左神算法第八节课:介绍递归和动态规划(汉诺塔问题;打印字符串的全部子序列含空;打印字符串的全排列,无重复排列;母牛数量;递归栈;数组的最小路径和;数组累加和问题,一定条件下最大值问题(01背包))

暴力递归: 1,把问题转化为规模缩小了的同类问题的子问题 2,有明确的不需要继续进行递归的条件(base case) 3,有当得到了子问题的结果之后的决策过程 4,不记录每一个子问题的解 动态规划 1,从暴力递归中来 2,将每一个子问题的解记录下来,避免重复计算 3,把暴力递归的过程,抽象成了状态表达 4,并且存在化简状态表达,使其更加简洁的可能 一:递归 1. 汉诺塔问题 汉诺塔问题(不能大压小,只能小压大),打印n层汉诺塔从最左边移动到最右边的全部过程. 左中右另称为 from.to.hel

Leetcode:Triangle 三角形塔最小路径和

Triangle: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. For example, given the following triangle [ [2], [3,4], [6,5,7], [4,1,8,3] ] The minimum path sum from top to botto

LeetCode—Minimum Path Sum 二维数组最小路径,动态规划

感觉这是一系列的动态规划的算法,正好也将动态规划的算法进行一个总结: 算法一: 带权重的最小路径的问题 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. 首先每一个路径的上一个路径都是来自于其上方和左方 现将最上面的路径进行求和,最左边的路径进行求和