矩阵的最小路径和——动态规划
题目描述:
给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。
示例:
[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]]
返回值:
12
备注:
1<=n,m<=2000
1<=arri,j<=100
我的初始思路是想从左上角(0,0)开始出发,每一步比较右边和下边元素的大小,哪个小往那边走,一直走到右下角(n-1,m-1)为止。这个思路是错误的。
反例如下:
如果按我的初始思路,应该是红色路线,最终得到结果是11。而按蓝色路线最终得到的结果是10,比红色路线的结果更小。因此红色路线不是最小路径和。
这道题使用动态规划的思想。逐个计算出矩阵每个位置上的最小路径和,矩阵dp记录每个位置的最小路径和。
矩阵的第一行的位置只能通过不断右移得到。dp[0][j] = a[0][j] + dp[0][j-1];
矩阵的第一列的位置只能通过不断下移得到。dp[i][0] = dp[i-1][0] + a[i][0];
矩阵的其他内部位置比较从上面和从左边过来哪个路径和更小就取哪个值。dp[i][j] = a[i][j] + min(dp[i][j-1],dp[i-1][j]);
最终返回矩阵右下角dp[n-1][m-1]即为所求的矩阵的最小路径和。
参考了牛客网上大神的想法(链接:https://www.nowcoder.com/questionTerminal/7d21b6be4c6b429bb92d219341c4f8bb?answerType=1&f=discussion)
C++实现:
int minPathSum(vector<vector<int> >& matrix) {// write code hereint i, j;int n = matrix.size(), m = matrix[0].size();for (i = 0, j = 1; j < m; j++) //第一行只能通过不断右移得到{matrix[i][j] += matrix[i][j - 1];}for (j = 0, i = 1; i < n; i++) //第一列只能通过不断下移得到{matrix[i][j] += matrix[i - 1][j];}for (i = 1; i < n; i++) //中间元素比较从上面和从左边过来哪个路径和更小就取哪个值{for (j = 1; j < m; j++){if (matrix[i][j - 1] < matrix[i - 1][j]){matrix[i][j] += matrix[i][j - 1];}else{matrix[i][j] += matrix[i - 1][j];}}}return matrix[n - 1][m - 1]; //矩阵最小路径和
}
矩阵的最小路径和——动态规划相关推荐
- 牛客题霸 [矩阵的最小路径和] C++题解/答案
牛客题霸 [矩阵的最小路径和] C++题解/答案. 题目描述 给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的 ...
- 三角形最小路径和(动态规划)
原创公众号:bigsai 欢迎加入力扣打卡 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 题目描述 力扣120原题 给定一个三角形 triangle ,找出自顶向下的最小路径和. ...
- [Leetcode][第120题][JAVA][三角形最小路径和][动态规划][递归]
[问题描述][中等] [解答思路] 1. 动态规划思路一 自上而下 第 1 步:设计状态 f[i][j] 表示从三角形顶部走到位置 (i,j) 的最小路径和 位置(i,j) 指的是三角形中第 i 行第 ...
- LeetCode 120. 三角形最小路径和(动态规划)
题目描述 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径 ...
- 矩阵的最小路径和(Java)
题目: 给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后达到右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和. 举例: 给定的m如下: 1 3 5 9 8 1 3 ...
- 93. Leetcode 64. 最小路径和 (动态规划-路径规划)
步骤一.确定状态: 1.确定原问题中变化的变量个数 2.考虑最后一步 右下角坐标设为(m-1,n-1) 那么前一步一定是在(m-2,n-1)或者(m-1,n-2) 步骤二.推断状态方程: f[i][j ...
- LeetCode 64.最小路径和(动态规划)
题目描述 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5 ...
- 【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题
加qq1126137994 一起学习更多技术!!! 有一个矩阵map,它每个格子有一个权值.从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有 ...
- 动态规划算法--矩形最小路径和
题目:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小,每次只能向下或者向右移动一步 输入: [[1,3,1],[1,5,1],[4,2,1] ] ...
最新文章
- matlab 某些函数
- 这38个小技巧告诉你如何快速学习MySQL数据库
- IT人的十八般武艺-序言
- C++用顶层函数重载操作符(一)
- Python入门100题 | 第079题
- 关于容器迁移、运维、查错与监控,你想知道的都在这里了
- [云炬创业基础笔记]第七张创业团队测试3
- 【团队管理】改造团队成员?
- 使用Java 8进行分组,转换和归约
- linux安装数据库依赖包,Linux下安装DB2的包依赖
- 关于比较两个字节数组是否内容相同
- flex4.5的DataGrid
- Mysql update 语句(chm文档)
- 【Android 四大组件之Content Provider】一文吃透 BroadcastReceiver 广播接收器
- Meta Learning:元学习模型MAML和Reptile详解
- 量化交易入门,看这篇就够了
- 魔兽世界服务器卡 邮件寄不出去,魔兽世界怀旧服邮件收不到怎么办 WOW怀旧服邮件取不出来解决方法...
- 求助一维光子晶体的FDTD代码!万分感谢
- Vue基础语法知识(自用,完整版)
- c语言按键事件判断函数kbhit和按键获取函数getch