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

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

示例:

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

基础的动态规划问题,适合理解动态规范的想法

没有像之前设一个行和列+1的数组,这样更直观些不容易犯错

  1. class Solution {
  2. public int minPathSum(int[][] grid) {
  3. int m = grid.length; //行数
  4. int n = grid[0].length; //列数
  5. int[][] dp = new int[m][n];
  6. //初始化第一行和第一列
  7. dp[0][0] = grid[0][0];
  8. for (int i=1;i<n;i++) {
  9. dp[0][i] = dp[0][i-1] + grid[0][i];
  10. }
  11. for (int i=1;i<m;i++) {
  12. dp[i][0] = dp[i-1][0] +grid[i][0];
  13. }
  14. for (int i=1;i<m;i++) {
  15. for (int j=1;j<n;j++) {
  16. dp[i][j] = grid[i][j] + Math.min(dp[i-1][j],dp[i][j-1]);
  17. }
  18. }
  19.  
  20. return dp[m-1][n-1];
  21. }
  22. }

【leetcode-62 动态规划】 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径?

例如,上图是一个7 x 3 的网格。有多少可能的路径?

说明:m 和 的值均不超过 100。

示例 1:

  1. 输入: m = 3, n = 2
  2. 输出: 3
  3. 解释:
  4. 从左上角开始,总共有 3 条路径可以到达右下角。
  5. 1. 向右 -> 向右 -> 向下
  6. 2. 向右 -> 向下 -> 向右
  7. 3. 向下 -> 向右 -> 向右

示例 2:

  1. 输入: m = 7, n = 3
  2. 输出: 28
  3.  
  4. 与上题类似,基础
    我的:
  1. class Solution {
  2. public int uniquePaths(int m,int n) {
  3.  
  4. int[][] dp = new int[m][n];
  5. //初始化第一行和第一列
  6. dp[0][0] = 1;
  7. for (int i=1;i<n;i++) {
  8. dp[0][i] = 1;
  9. }
  10. for (int i=1;i<m;i++) {
  11. dp[i][0] = 1;
  12. }
  13. for (int i=1;i<m;i++) {
  14. for (int j=1;j<n;j++) {
  15. dp[i][j] = dp[i-1][j] + dp[i][j-1];
  16. }
  17. }
  18.  
  19. return dp[m-1][n-1];
  20. }
  21. }

63. 不同路径 II

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

说明:m 和 的值均不超过 100。

示例 1:

  1. 输入:
  2. [
  3.   [0,0,0],
  4.   [0,1,0],
  5.   [0,0,0]
  6. ]
  7. 输出: 2
  8. 解释:
  9. 3x3 网格的正中间有一个障碍物。
  10. 从左上角到右下角一共有 2 条不同的路径:
  11. 1. 向右 -> 向右 -> 向下 -> 向下
  12. 2. 向下 -> 向下 -> 向右 -> 向右
  1. public int uniquePathsWithObstacles(int[][] obstacleGrid) {
  2. int m = obstacleGrid.length;
  3. int n = obstacleGrid[0].length;
  4. int[][] dp = new int[m][n];
  5. //初始化第一行和第一列
  6. if (obstacleGrid[0][0] == 1) {
  7. dp[0][0] = 0;
  8. } else {
  9. dp[0][0] = 1;
  10. }
  11. for (int i=1;i<n;i++) {
  12. if (obstacleGrid[0][i] == 1)
  13. dp[0][i] = 0;
  14. else
  15. dp[0][i] = dp[0][i-1];
  16. }
  17. for (int i=1;i<m;i++) {
  18. if (obstacleGrid[i][0] == 1)
  19. dp[i][0] = 0;
  20. else
  21. dp[i][0] = dp[i-1][0];
  22. }
  23. for (int i=1;i<m;i++) {
  24. for (int j=1;j<n;j++) {
  25. if (obstacleGrid[i][j] == 1) {
  26. dp[i][j] = 0;
  27. } else {
  28. dp[i][j] = dp[i-1][j] + dp[i][j-1];
  29. }
  30. }
  31. }
  32. return dp[m-1][n-1];
  33. }

【leetcode-62,63,64 动态规划】 不同路径,最小路径和的更多相关文章

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

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

  2. [leetcode]64. 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. LeetCode 62,从动态规划想到更好的解法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第36篇文章,我们一起来看下LeetCode的62题,Unique Paths. 题意 其实这是一道老掉牙的题目了 ...

  4. LeetCode 62. Unique Paths(所有不同的路径)

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  5. leetcode@ [62/63] Unique Paths II

    class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleG ...

  6. LeetCode OJ:Minimum Path Sum(最小路径和)

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

  7. [LeetCode] 62. Unique Paths 唯一路径

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  8. (step6.3.4)hdu 1151(Air Raid——最小路径覆盖)

    题意:     一个镇里所有的路都是单向路且不会组成回路. 派一些伞兵去那个镇里,要到达所有的路口,有一些或者没有伞兵可以不去那些路口,只要其他人能完成这个任务.每个在一个路口着陆了的伞兵可以沿着街去 ...

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

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

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

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

随机推荐

  1. 【13NOIP提高组】转圈游戏(信息学奥赛一本通 1875)(洛谷 1965)

    题目描述 nn 个小描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号 ...

  2. Django 数据库与ORM

    一.数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库.  <1> sqlite django默认使用sqlite的数据库,默认自带 ...

  3. go语言Mac下编译安装语言包

    这两天公司成立了go语言学习兴趣小组,慕名参与了学习.目前对于go是0基础,只知道它可以做高并发.效率快.编译简单.母语是C. go的安装有多种形式,编译安装是比较慢的一个,今天我就记录一下学习go编 ...

  4. leetcode: 最长上升子序列

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

  5. Linux平台Boost 1.6.7的编译方法

    boost库下载地址:https://dl.bintray.com/boostorg/release/ 编译: 1. 获得bjam (1) # cd /usr/src/boost_1_67_0 (2) ...

  6. mapdb的适用场景介绍

    对于大部分系统来说,mapdb并无太大价值,而且增加了成本.但是如果一级缓存巨大例如数以十GB级别,或占据了整个JVM的1/2以上,mapdb的价值就会体现出来.正如其官网介绍: MapDB prov ...

  7. OSPF协议介绍及配置

    一.OSPF概述 回顾一下距离矢量路由协议的工作原理:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表,通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加载进自己的路由表中,而对于这个网 ...

  8. CentOS6非root用户下安装及配置CDH5.3.0

    #install lsb packagesudo yum install -y redhat-lsb #install net-tools package sudo yum install -y ne ...

  9. ThinkPhp5 数据迁移(think-migration)

    ThinkPhp5 数据迁移(think-migration)   在thinkphp5中提供了数据迁移工具(think-migration),它是机遇phinx开发(文档地址:http://docs ...

  10. springMVC返回json数据乱码问

    在springMVC controller中返回json数据出现乱码问题,因为没有进行编码,只需要简单的注解就可以了 在@RequestMapping()中加入produces="text/ ...