这题和62题以及63题类似,只不过dp数组的状态表示变了,这里dp数组不再表示方案数,而是到当前格子的最小路径和。可以发现:要到达第i行第j列的格子,只有从第i - 1行第j列的格子或第i行第j - 1列的格子加上到第i行第j列的格子需要的代价(grid[i][j])得到,所以如果要得到到第i行第j列格子的最小路径和,我们只需要获取第i - 1行第j列的格子或第i行第j - 1列的格子二者中路径和较小的那个,再加上grid[i][j]即可。

由此我们得到状态转移方程:dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];

获得状态转移方程后,还需要对dp数组做初始化,显然第0列某个格子的最小路径和等于从起点开始到当前格子的所有代价(grid)相加得到,因为要到第0列的格子只有从起点一直向下走这一种走法。同理,到第0行的格子也等于从起点开始到当前格子的所有代价总和。

有了递推边界和状态转移方程之后,我们就可以从边界递推到整个数组,最终返回右下角的格子的最小路径和。

  1. class Solution {
  2. public:
  3. int minPathSum(vector<vector<int>>& grid) {
  4. int rows = grid.size(), cols = grid[0].size(); //获取总行数和总列数
  5. if(rows == 0 || cols == 0) { //需要特判行数或列数为0的情况,LeetCode特色
  6. return 0;
  7. }
  8. vector<vector<int>> dp(rows, vector<int>(cols)); //dp[i][j]表示到第i行第j列的格子的最小路径和
  9. dp[0][0] = grid[0][0];
  10. for(int i = 1; i < rows; ++i) { //初始化边界:第0列的所有格子的最小路径和都是从起点开始到当前格子的代价总和
  11. dp[i][0] = dp[i - 1][0] + grid[i][0];
  12. }
  13. for(int i = 1; i < cols; ++i) { //初始化边界:第0行的所有格子的最小路径和都是从起点开始到当前格子的代价综合
  14. dp[0][i] = dp[0][i - 1] + grid[0][i];
  15. }
  16. for(int i = 1; i < rows; ++i) {
  17. for(int j = 1; j < cols; ++j) {
  18. dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
  19. }
  20. }
  21. return dp[rows - 1][cols - 1];
  22. }
  23. };

LeetCode64. 最小路径和的更多相关文章

  1. leetcode-64. 最小路径和 · vector + DP

    题面 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right wh ...

  2. [Swift]LeetCode64. 最小路径和 | Minimum Path Sum

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  3. 58同城笔试题:数组去重;分饼干(分糖果);最小路径和(leetcode64)

    1. 数组去重 题目描述 /** * 有序数组去重 * 输出最终的数字个数 * 输入:1,2,2 * 输出:2 * @author Turing * */ 代码 import java.util.*; ...

  4. [LeetCode] Minimum Path Sum 最小路径和

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  5. 【HDU1960】Taxi Cab Scheme(最小路径覆盖)

    Taxi Cab Scheme Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. 最小路径(prim)算法

    #include <stdio.h>#include <stdlib.h>/* 最小路径算法 -->prim算法 */#define VNUM 9#define MV 6 ...

  7. loj 1429(可相交的最小路径覆盖)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1429 思路:这道题还是比较麻烦的,对于求有向图的可相交的最小路径覆盖,首先要解决成环问 ...

  8. 【HDU3861 强连通分量缩点+二分图最小路径覆盖】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.有边u到v以及有 ...

  9. POJ 3216 最小路径覆盖+floyd

    Repairing Company Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 6646   Accepted: 178 ...

随机推荐

  1. Redis高可用-主从,哨兵,集群

    主从复制 Master-Slave主从概念 同时运行多个redis服务端,其中一个作为主(master),其他的一个或多个作为从(slave),主从之间通过网络进行通讯,slave通过复制master ...

  2. .NetCore3.1中的WebApi如何配置跨域

    写法 一: 1. 打开Startup.cs,定义静态变量Any,用以配置跨域. private readonly string Any = "Any"; 2. 在Configure ...

  3. Java实现 LeetCode 268 缺失数字

    268. 缺失数字 给定一个包含 0, 1, 2, -, n 中 n 个数的序列,找出 0 - n 中没有出现在序列中的那个数. 示例 1: 输入: [3,0,1] 输出: 2 示例 2: 输入: [ ...

  4. Java实现 LeetCode 63 不同路径 II(二)

    63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在 ...

  5. PAT 福尔摩斯的约会

    大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明白了,字条上奇 ...

  6. FTM-100DR、FTM-400DR、FTM-400XDR和DR-1X 连接MMDVM中继板接线图BG7IYN

  7. 二叉树路径搜索---DFS 路径和

    vector<vector<int>> pathSum(TreeNode* root,int sum){//DFS遍历获取适合路径,当递归到叶子结点且sum为0,表示该路径合适 ...

  8. Linux创建与删除

    一.创建文件夹.文本.用户.组 mkdir 创建文件夹 touch 创建文本 useradd 创建用户 例1:创建一个文件夹xiaomi 创建文件夹:mkdir xiaomi 例2:创建一个文件如ad ...

  9. Netty 源码解析: Netty 的 ChannelPipeline

    ChannelPipeline和Inbound.Outbound         我想很多读者应该或多或少都有 Netty 中 pipeline 的概念.前面我们说了,使用 Netty 的时候,我们通 ...

  10. 容器编排工具之Docker-compose

    前文我们聊了下docker私有仓库harbor的搭建,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13061984.html:在上一篇博客的末尾,我们简单聊了 ...