矩阵的最小路径和

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

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

示例 1:

输入: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];
}
};

【LeetCode动态规划#16】矩阵的最小路径和、三角形的最小路径和的更多相关文章

  1. 【BZOJ1494】【NOI2007】生成树计数(动态规划,矩阵快速幂)

    [BZOJ1494][NOI2007]生成树计数(动态规划,矩阵快速幂) 题面 Description 最近,小栋在无向连通图的生成树个数计算方面有了惊人的进展,他发现: ·n个结点的环的生成树个数为 ...

  2. leetcode_935. Knight Dialer_动态规划_矩阵快速幂

    https://leetcode.com/problems/knight-dialer/ 在如下图的拨号键盘上,初始在键盘中任意位置,按照国际象棋中骑士(中国象棋中马)的走法走N-1步,能拨出多少种不 ...

  3. 快速上手leetcode动态规划题

    快速上手leetcode动态规划题 我现在是初学的状态,在此来记录我的刷题过程,便于以后复习巩固. 我leetcode从动态规划开始刷,语言用的java. 一.了解动态规划 我上网查了一下动态规划,了 ...

  4. 【CF1151F】Sonya and Informatics(动态规划,矩阵快速幂)

    [CF1151F]Sonya and Informatics(动态规划,矩阵快速幂) 题面 CF 题解 考虑一个暴力\(dp\).假设有\(m\)个\(0\),\(n-m\)个\(1\).设\(f[i ...

  5. 【BZOJ5298】[CQOI2018]交错序列(动态规划,矩阵快速幂)

    [BZOJ5298][CQOI2018]交错序列(动态规划,矩阵快速幂) 题面 BZOJ 洛谷 题解 考虑由\(x\)个\(1\)和\(y\)个\(0\)组成的合法串的个数. 显然就是把\(1\)当做 ...

  6. 【BZOJ4870】组合数问题(动态规划,矩阵快速幂)

    [BZOJ4870]组合数问题(动态规划,矩阵快速幂) 题面 BZOJ 洛谷 题解 显然直接算是没法做的.但是要求的东西的和就是从\(nk\)个物品中选出模\(k\)意义下恰好\(r\)个物品的方案数 ...

  7. CF954F Runner's Problem(动态规划,矩阵快速幂)

    CF954F Runner's Problem(动态规划,矩阵快速幂) 题面 CodeForces 翻译: 有一个\(3\times M\)的田野 一开始你在\((1,2)\)位置 如果你在\((i, ...

  8. LeetCode:螺旋矩阵||【59】

    LeetCode:螺旋矩阵||[59] 题目描述 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ...

  9. LeetCode:螺旋矩阵【54】

    LeetCode:螺旋矩阵[54] 题目描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], ...

  10. BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线:spfa + 二分【路径中最大边长最小】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1614 题意: 给你一个无向图,n个点,m条边. 你需要找出一条从1到n的路径,使得这条路径 ...

随机推荐

  1. [转帖]【dperf系列-5】使用dperf进行性能测试(初级)

    https://zhuanlan.zhihu.com/p/451341132 dperf是一款高性能的开源网络压力测试仪,是Linux基金会旗下的DPDK官方生态项目.本文介绍如利用dperf在两台物 ...

  2. top的简单学习

    获取当前进程的全部线程 jps 获取jvm的进程信息. top -Hp $pid -bn 1 > 1.txt 可以获取当前特定进程的所有子进程. 注意linux与Windows的不太一样. li ...

  3. 【计数,DP】CF1081G Mergesort Strikes Back

    Problem Link 现有一归并排序算法,但是算法很天才,设了个递归深度上限,如果递归深度到达 \(k\) 则立即返回.其它部分都和正常归并排序一样,递归中点是 \(\lfloor (l+r)/2 ...

  4. echarts饼状图自定义legend的样式付费

    先看效果图 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  5. 【解决了一个小问题】terraform apply 的时候出现访问 localhost 出错

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 有这样一段 terraform 的部署脚本: provid ...

  6. 【解决了一个小问题】在某个linux基础镜像中安装python特定的版本

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 在某个基础镜像中,安装了python3.6.但是一个测试需 ...

  7. 开发QQ官方机器人

    QQ 频道机器人开发简明教程 1. 简介 QQ 频道机器人是一种可以在 QQ 频道中与用户进行互动的服务.这个教程旨在帮助新手学习如何使用 Python 的官方SDK,快速实现一些基本的机器人功能. ...

  8. Rider调试时断点打不上(变灰色小叉)

    记录我在使用rider调试Unity的C#代码时遇到断点变灰色小叉叉,断点打不上/(不会进入断点)的几种解决办法 首先要确保你没有禁用所有的断点,然后再尝试使用本文的三种方法. 不要禁用所有断点 在R ...

  9. 从零开始配置 vim(8)——文件类型检测

    在上一章介绍自动命令的时候,我们提到可以使用 FileType来根据文件类型来触发事件,但是关于文件类型并没有深入的介绍,本篇我们来补充关于文件类型相关的内容,让大家更好的理解,看不懂也没关系,你只需 ...

  10. 6.1 Windows驱动开发:内核枚举SSDT表基址

    SSDT表(System Service Descriptor Table)是Windows操作系统内核中的关键组成部分,负责存储系统服务调用的相关信息.具体而言,SSDT表包含了系统调用的函数地址以 ...