题目描述:

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

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

示例:

  1. 输入:
  2. [
  3.  [1,3,1],
  4. [1,5,1],
  5. [4,2,1]
  6. ]
  7. 输出: 7
  8. 解释: 因为路径 13111 的总和最小。

要完成的函数:

int minPathSum(vector<vector<int>>& grid)

说明:

1、给定一个二维数组grid,表示一个网格中所有点的代价,要找到一条从网格左上角到右下角的路径,只能向下走,或者向右走,使得这条路径上的代价的和最小。

最后返回这个最小的代价和。

2、这道题如果使用暴力穷举法,除了最后一行的元素和最后一列的元素都只有一种选择外(右下角元素没有选择),其余元素都有两种选择。

比如第一行第一列的元素1,可以选择往右走或者往下走,两种选择。

当网格变大之后,穷举法太耗时了。因此我们采用其他方法。

学习过算法设计的同学一看这道题应该就能想到动态规划的方法。

我们用动态规划的方法记录到达每一个点的最小路径代价。

左上角的元素的最小路径代价肯定就是自身。

其余元素的最小路径代价,要不就是左边元素的最小路径代价+自身代价,要不就是上方元素的最小路径代价+自身代价,最后两者之中取一个小的,作为自身这个元素的最小路径代价。

不断地迭代下去,最后右下角的元素的最小路径代价就是我们所求的。

代码如下:(附详解)

  1. int minPathSum(vector<vector<int>>& grid)
  2. {
  3. if(grid.empty())return 0;//如果矩阵是空的,那么返回0
  4. int hang=grid.size(),lie=grid[0].size();
  5. vector<vector<int>>record(hang,vector<int>(lie,0));//初始化一个矩阵用来记录每一个点的最小路径代价
  6. for(int i=0;i<hang;i++)
  7. {
  8. for(int j=0;j<lie;j++)
  9. {
  10. if(i==0&j==0)//如果是左上角的元素,代价等于自身
  11. record[i][j]=grid[i][j];
  12. else
  13. {
  14. if(i==0)//如果是第0行的元素,代价只能从左边元素“继承”过来
  15. record[i][j]=record[i][j-1]+grid[i][j];
  16. else if(j==0)//如果是第0列的元素,代价只能从上方元素“继承”过来
  17. record[i][j]=record[i-1][j]+grid[i][j];
  18. else//如果是中间部分的元素,就取两者之中小的那一个
  19. record[i][j]=min(record[i][j-1]+grid[i][j],record[i-1][j]+grid[i][j]);
  20. }
  21. }
  22. }
  23. return record[hang-1][lie-1];
  24. }

上述代码实测8ms,beats 96.95% of cpp submissions。

leetcode-64-最小路径和的更多相关文章

  1. leetcode 64. 最小路径和 动态规划系列

    目录 1. leetcode 64. 最小路径和 1.1. 暴力 1.2. 二维动态规划 2. 完整代码及执行结果 2.1. 执行结果 1. leetcode 64. 最小路径和 给定一个包含非负整数 ...

  2. LeetCode 64. 最小路径和(Minimum Path Sum) 20

    64. 最小路径和 64. Minimum Path Sum 题目描述 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明: 每次只能向下或 ...

  3. Java实现 LeetCode 64 最小路径和

    64. 最小路径和 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], ...

  4. [LeetCode] 64. 最小路径和 ☆☆☆(动态规划)

    描述 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入:[  [1,3,1], [1,5,1 ...

  5. LeetCode 64最小路径和

    题目 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [   [1,3,1], [1,5 ...

  6. [LeetCode]64. 最小路径和(DP)

    题目 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4 ...

  7. Leetcode——64. 最小路径和

    题目描述:题目链接 同样对于这个问题,我们可以考虑用动态规划来解决. 解决动态规划常见的三个步骤: 1:问题的归纳.对于 i,j 位置上的最短路径可以用d[ i ][ j ]表示. 2:归纳递推式:d ...

  8. leetcode 64. 最小路径和Minimum Path Sum

    很典型的动态规划题目 C++解法一:空间复杂度n2 class Solution { public: int minPathSum(vector<vector<int>>&am ...

  9. Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum)

    Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum) 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. ...

  10. Leetcode题目64.最小路径和(动态规划-中等)

    题目描述: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1, ...

随机推荐

  1. 打开jsp页面时,显示空白页。

    打开jsp页面时,显示空白页.   #foreach($e in $listPlanItem)          #set($listPlanDetail=$!e.get(2))        < ...

  2. php 事务处理,ActiveMQ的发送消息,与处理消息

    可以通过链式发送->处理->发送...的方式处理类似事务型业务逻辑 比如 发送一个注册消息,消息队列处理完注册以后,紧接着发送一个新手优惠券赠送,赠送完再发一个其它后续逻辑处理的消息等待后 ...

  3. winform 按键控制

    用ADSW来控制前后左右,J表示开火,J不能连续按 _+表示速度档位. DateTime _LastPress = DateTime.MinValue; Keys _PrevKey = Keys.No ...

  4. 学习前端的菜鸡对JS 的classList理解

    classList 在早期的时候要添加,删除类 需要用className去获取,然后通过正则表达式去判断这个类是否存在. 代码上去会有点麻烦,现在有了classList 就方便了很多. ——————— ...

  5. 推荐:普通UI设计师与顶级UI设计师的区别是什么?(转)

    我不是顶级设计师(我甚至不知道什么才叫顶级),即使见过的一些顶级(知名or优秀)设计师也因为交流不深入,无法评价.但是我勉强可以回答优秀的设计师,和普通的设计师(其实我觉得大部分的普通设计师只是认识他 ...

  6. Robotframework 简介及工作原理

    下面通过官网和网上资料来简单介绍下Robotframework及其工作原理. 官方说明: Robot Framework is a generic test automation framework ...

  7. 菜鸟——springboot+mybatis+maven

    网上找了很多资料,学习如何搭建springboot,由于刚刚接触springboot,不是很熟练,通过参考网上别人搭建的例子,自己也搭建了一个简单的springboot+mybaits+maven 网 ...

  8. 集合(一)ArrayList

    前言 这个分类中,将会写写Java中的集合.集合是Java中非常重要而且基础的内容,因为任何数据必不可少的就是该数据是如何存储的,集合的作用就是以一定的方式组织.存储数据.这里写的集合,一部分是比较常 ...

  9. [FMX]将 Android 程序切换到后台及从后台切换到前台实现

    有时候,我们需要将自己的Android程序切换到后台运行,在必要时,将其切换到前台运行.下面提供了一种实现方式,首先需要引用三个单元:   1 uses Androidapi.JNI.App,Andr ...

  10. cxgrid动态显示行号

    uses cxLookAndFeelPainters; type TMyCxGrid = class(TObject)    class procedure DrawIndicatorCell(    ...