首页 > 其他分享 >【LeetCode动态规划#16】矩阵的最小路径和、三角形的最小路径和

【LeetCode动态规划#16】矩阵的最小路径和、三角形的最小路径和

时间:2023-08-25 12:33:50浏览次数:44  
标签:triangle 16 int 路径 最小 grid dp

矩阵的最小路径和

给定一个包含非负整数的 *m* x *n* 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:一个机器人每次只能向下或者向右移动一步。

示例 1:

img
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 100

代码与思路

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int row = grid.size();
        int col = grid[0].size();

        vector<vector<int>> dp(row + 1, vector<int>(col + 1, 0));
        //这里要初始化,并且也要遵循dp数组的含义
        //即:走到(i,j)时的最小路径和为dp[i][j]
        //因为走到一个方块只能从该方块的左边和上边过来
        //所以初始时上和左都是网格边界,没东西走过来,此时到起始点位的最小路径和就是当前点位的路径数值
        dp[0][0] = grid[0][0];
        //还是遵守“只能从上方和左边到达某个位置”的规律
        //于是有了下面三种情况,构成递推公式
        for(int i = 1; i < row; ++i){//网格最上方的路径和
            //到达(i,j)的最小路径和 = 到达(i - 1, j)的最小路径和 + i处的路径值
            dp[i][0] = dp[i - 1][0] + grid[i][0];
        }
        for(int j = 1; j < col; ++j){//网格最左边的路径和
            dp[0][j] = dp[0][j - 1] + grid[0][j];
        }
        //上面两种情况有点像在初始化dp数组,但起始不完全是
        for(int i = 1; i < row; ++i){//网格内部
            for(int j = 1; j < col; ++j){
                //取从上方和左方中小的那一个座位更新值
                dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }
        return dp[row - 1][col - 1];
    }
};

三角形最小路径和

给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 ii + 1

示例 1:

输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:
   2
  3 4
 6 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

示例 2:

输入:triangle = [[-10]]
输出:-10

提示:

  • 1 <= triangle.length <= 200
  • triangle[0].length == 1
  • triangle[i].length == triangle[i - 1].length + 1
  • -104 <= triangle[i][j] <= 104

思路

根据题意,我们还是只能往下或者往右遍历(即求某个位置的路径,只能从其上方或者左侧推导而来)

dp数组的含义仍然是:走到(i,j)时的最小路径和为dp[i][j]

题目要找的是"找出自顶向下的最小路径和",一般来说就会从上往下遍历三角形了,但是这样会有麻烦

三角形的顶点是唯一的,但底部边有很多个位置,这就意味着我们如果从从上往下遍历三角形最后会得到多条路径结果,然后还需要去选择哪一条的路径和最小

如果反着来,从三角形底部往上遍历,一开始就选中底部路径值最小的位置,这样就不需要再遍历结束后再选择最小路径了

代码

从三角形底部往上遍历

注意:是从底边再往上一层开始,也就是倒数第二层

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int layer = triangle.size(); // 获取三角形的层数
        vector<vector<int>> dp(layer + 1, vector<int>(layer + 1, 0));

        for (int i = layer - 1; i >= 0; --i) { // 从三角形的底部倒数第二层开始向上遍历
            for (int j = 0; j < triangle[i].size(); ++j) {//在层中从左往右遍历
                //最外层的for循环是使得遍历方向一直向上的
                //这里要取当前层和它的下一层之间的最小值来更新dp
                //比如,在最开始遍历的时候,是倒数第二层,此时还要去倒数第一层的对应位置查看dp值,取小的来更新dp
                dp[i][j] = min(dp[i + 1][j], dp[i + 1][j + 1]) + triangle[i][j];
            }
        } // 从底层向顶层求最小路径和
        //求自顶向下的最小路径和,根据dp数组的含义就是求00处的dp值呗
        return dp[0][0];
    }
};

标签:triangle,16,int,路径,最小,grid,dp
From: https://www.cnblogs.com/DAYceng/p/17656630.html

相关文章

  • 【Java复杂系统实战经验-2023-08月】Java基础,Path路径计算编码
    Java程序设计-个人月报-2023-08月背景在本月,给负责的项目做了一次文件存储的迁移工作。历史原因,开发阶段由于图简便,使用了本地文件存储。后面经过容器化上云,导致应用出现上传文件分发的多节点的问题。本项工作的经验,受益于Java基础Path的一些API,颇有收获。复杂的系统应当构......
  • 最小生成树学习笔记
    Prim算法prim算法基本思想:基于点的解决方式先随便选择一个点s作为起点,把其他所有点设为未添加节点,再设一dis数组,代表每个节点到最小生成树最近点的距离,易得一开始只有dis[s]=0,其他均为∞。每轮找到dis值最小且未添加过的节点加入生成树中,且使用这个节点的邻边去更新它的邻点......
  • 例题两则(不无聊的子序列,HNOI2016序列)
    分享例题两则主要是分享一种\(\text{trick}\)。\(\text{UVA1608}\)题目描述给定一个长度为\(n\)的序列\(a\),如果\(a\)的每一个子串都存在至少一个元素只出现了一次,输出\(\text{Non-boring}\)。反之,输出\(\text{Boring}\)。\(n\leqslant2\times10^5\)。思路点......
  • VScode settings.json默认配置文件路径
    LinuxUbuntu:/home/${用户名}/.config/Code/User/settings.jsonWindows:C:\Users\用户名\AppData\Roaming\Code\User来源、参考:https://blog.csdn.net/cyqzy/article/details/130011314......
  • windows远程桌面到ubuntu16.04
    环境ubuntu:16.04windows:windows10目标让windows可以使用RemoteDesktop客记端远程到ubuntu16.04安装事宜windowns无需安装ubuntu16.04需要安装xrdp和xfce4安装sudoaptinstallxrdpxfce4查看安装版本,发现默认安装的是xrdp0.6.1修改配置sudoechoxfce4-sessi......
  • 代码随想录第二天|977.有序数组的平方;209.长度最小的子数组;59.螺旋矩阵II,总结
    今天的这三道题每道题对我来说都不简单,有序数组的平方和长度最小的子数组这两道题还能用暴力求解,螺旋矩阵看着简单却没有思路,磨了半小时还是决定直接看讲解有序数组平方和用的双指针的思想,代码如下:1classSolution{2public:3vector<int>sortedSquares(vector<int......
  • 20天 hot 100 速通计划-day16
    堆295.数据流的中位数中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。例如arr=[2,3,4]的中位数是3。例如arr=[2,3]的中位数是(2+3)/2=2.5。实现MedianFinder类:MedianFinder()初始化MedianFinder......
  • CF1662C European Trip
    CF1662CEuropeanTrip感觉很不错的矩阵乘法加速题。从\(n,k\)的数据范围大致可以看出是矩阵乘法加速递推。设\(f_{k,u,v}\)表示从\(u\)走到\(v\)走了\(k\)步的合法方案数,初始状态\(f_1\)即为邻接矩阵,最终答案为\(\sum_{i=1}^{n}f_{k,i,i}\)。正常的转移方程为......
  • 「SDOI2016」排列计数tj(附压行代码)
    现在求有多少种长度为n的序列A,满足以下条件:1~n这n个数在序列中各出现了一次若第i个数A[i]的值为i,则称i是稳定的。序列恰好有m个数是稳定的满足条件的序列可能很多,序列数对10^9+7取模。输入第一行一个数T,表示有T组数据。接下来T行,每行两个整数n、......
  • 16. 股票 stock
    股票的特点企业出让股权,发生股票,定期分红给股东,无需到期偿还,每个股东都拥有经营决策权,如果企业经营亏损那么股东也要承担风险。不像债权可以抵税,股权产生的分红不可以抵税TaxDeductible金融杠杆FinancialLeverage以小博大。当投资回报率超过利率时,超出利息的部分就全部归股......