矩阵的最小路径和

给定一个包含非负整数的 *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. [转帖]010 Linux 文本统计与去重 (wc 和 uniq)

    https://my.oschina.net/u/3113381/blog/5427461 wc 命令一般是作为组合命令的一员与其他命令一同起到统计的作用.而一般情况下使用 wc -l 命令较多. u ...

  2. runc网络与systemd管理runc应用

    1. 创建网络命名空间 ip netns add <ns> # ns是自定义网络空间名 # 例如: ip netns add haproxy # 创建一个给 haproxy使用的网络命名空 ...

  3. vue3新特性teleport传送原来这么神奇

    我对teleport的理解 teleport有传送的意思,读音[te li po t][嘻嘻],看官们应该知道读啥子了吧 它可以将你写的代码传送到某一个地方 传送到哪一个地方呢? 传送到你标记的地方, ...

  4. echarts定义饼状图的指向线内容

    定义饼状图的指向线内容 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  5. 如何安装typescript-如何运行typescript

    如何安装 typescript npm install typescript -g 安装 ts 之前需要安装 node 哈 查看 ts 的版本 tsc -V 我的是 3.6.3 的版本 typescr ...

  6. NSSCTF Round#17 Basic CRYPTO

    Level_1 题目 Level_1.py(我把参数整理了一下,看着舒服) #真签到题 from Crypto.Util.number import bytes_to_long, getPrime f ...

  7. Paddlenlp之UIE模型实战实体抽取任务【打车数据、快递单】

    项目连接:可以直接fork使用 Paddlenlp之UIE模型实战实体抽取任务[打车数据.快递单] 0.背景介绍 本项目将演示如何通过小样本样本进行模型微调,快速且准确抽取快递单中的目的地.出发地.时 ...

  8. 华硕ROG Zenith Extreme Alpha主板评测:主板界的航空母舰

    在AMD推第一代锐龙线程撕裂者的时期,华硕ROG Zenith Extreme主板凭借给力的用料,各种便利的超频设计,出色的SupermeFX音效还有万兆网卡赢得了不少用户的好评.现在AMD推出了第二 ...

  9. 零基础入门学习JAVA课堂笔记 ——DAY08

    异常 1.什么是异常? Exception 异常是指程序在运行过程中出现的不期而至的各种状况 异常发生在程序运行期间,它影响了正常程序执行流程 通俗易懂的表达就是,程序在发生意料之外或者拿到的不是想要 ...

  10. redmine获取cookie和其他系统实现单点登录

    前言 最近有个需求,需要将我们一个平台对接到redmine,让用户可以通过这个平台直接在redmine提工单,需要实现免登录跳转.首先是想到去查redmine有无相应的单点登录功能,查到redmine ...