[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],

[6,               5,             7, INT_MAX],

[4,               1,             8,              3],

]

有上面方阵很容易得出这个状态转移方程为

dp[i][j]=min(dp[i-1][j-1],dp[i-1][j])+triangle[i-1][j-1];

为了避开数组越界(人i=0或j=0)的问题,我们的dp数组容量比triange大一:即triangle[i][j]->dp[i+1][j+1]

class Solution {
public:
   int minimumTotal(vector<vector<int>> &triangle)
{
    size_t n = triangle.size();
    int dp[n + 1][n + 1];
    memset(dp, 0x3f, sizeof(dp));
    int ans = INT_MAX;
    dp[1][1] = triangle[0][0];
    for (size_t i = 2; i <= n; i++)
    {
        for (size_t j = 1; j <= triangle[i - 1].size(); j++)
        {
            dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i-1][j-1];
        }
    }
    for (size_t i = 1; i <= n; i++)
    {
        ans = min(ans, dp[n][i]);
    }
    return ans;
}
};

或者根本不用再建立一个新的dp数组,而是直接在triangle数组上进行操作。比如

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        if(triangle.size() == 0 || triangle[0].size() == 0) return 0;
        int n = triangle.size();
        for(int i = n - 2; i >= 0; i--)
            for(int j = 0; j < i + 1; j++)
                triangle[i][j] += min(triangle[i+1][j], triangle[i+1][j+1]);
        return triangle[0][0];
    }
};

这一题的升级版问题可以看我的另一篇随笔: 下降路径最小和

原文地址:https://www.cnblogs.com/adamwong/p/10214509.html

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

[Leetcode]120.三角形路径最小和的相关文章

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]931.下降路径最小和

题目链接 这一题目首先需要弄懂题目的意思,下降路径最小和指的是在方阵中可以从上往下行走,走过后获得的值最小,方向可以是走左下,右下,直下. 题目和传统的动态规划一样,把边界的值先初始化,然后通过状态转移一步一步到最后一行 我们有dp[i][j]:意思是终点为(i,j)的下降路径最小值 状态方程为 dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1])+A[i][j] ; 分别代表从左上(i-1,j-1),从正上方(i-1,j),从右上方(i-

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

给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11). 说明: 如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分. 思路: 接着上一题的状态转移继续说 动态规划问题,重中之重就是找到状态转移方程,而状态转移方程很重要的一点就是明确函数的意义所在,以及记录结果

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

LeetCode 5129. 下降路径最小和 II Minimum Falling Path Sum II

地址 https://leetcode-cn.com/contest/biweekly-contest-15/problems/minimum-falling-path-sum-ii/ 题目描述给你一个整数方阵 arr ,定义「非零偏移下降路径」为:从 arr 数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列. 请你返回非零偏移下降路径数字和的最小值. 示例 1: 输入:arr = [[1,2,3],[4,5,6],[7,8,9]] 输出:13 解释: 所有非零偏移

Leetcode 120道题目

Leetcode 120道题目 [01]191. 位1的个数.231. 2的幂.342. 4的幂 原文地址:https://www.cnblogs.com/sunbines/p/10824622.html

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

算法学习——动态规划之点数值三角形的最小路径

算法描述 在一个n行的点数值三角形中,寻找从顶点开始每一步可沿着左斜或者右斜向下直到到达底端,使得每个点上的数值之和为最小 右图为一个4行的点数值三角形 算法思路 接收用户输入行数n 使用一个二维数组a[n+1][n+1]来存放各个点上的数值,数值可以由用户输入或者是随机生成 定义一个二维数组(用来存放方向)direction[n+1][n+1],存放1或0,1代表右,0代表左 定义一个二维数组b[n+1][n+1] 表示到底端的数值之和 以上图4行的点数值三角形为例 b[4][1]=47 b[

120.三角形最短路径(leetcode)

给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 法1): 本题典型的回溯算法,但是没有剪枝,在42/43个case的时候超时了,以下是代码. PS:尝试过如果当前和大于全局最小,则停止,但是由于有负数的存在,现在大的值也可以通过-9999成为最小值,剪枝失败. class Solution: def minimumTotal(self, triangle: List[List[int]]) -> int: if not triangle or not trian