这里,我们将遇到两类不同路径的问题,第一类不考虑障碍物,第二类考虑障碍物。

1. 不考虑障碍物

问题来源:不同路径I
问题描述:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
示例
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右
class Solution:def uniquePaths(self, m: int, n: int) -> int:# 记d(i, j)为(i+1)X(j+1)网格中总路径数# d(i, j) = d(i-1, j) + d(i, j-1)# d(0, j) = 1; d(i, 0) = 1# 构建二维矩阵d(i, j)d = [[0 for j in range(n)] for i in range(m)]# 动态规划for i in range(m):for j in range(n):# 边界条件if i == 0 or j == 0: d[i][j] = 1# 转移方程else:d[i][j] = d[i-1][j] + d[i][j-1]# 返回值return d[m-1][n-1]

2. 考虑障碍物

问题来源:不同路径II
问题描述:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
示例
输入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右
class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:# 如果开始位置为障碍物,则无路径if obstacleGrid[0][0] == 1: return 0# 如果目标位置为障碍物,则无路径if obstacleGrid[-1][-1] == 1: return 0# 定义状态:d(m-1, n-1)为m*n网格的路径总数# 状态转移:# 如果左边和上边都是障碍物,则d(i, j) = 0# 如果左边是障碍物,则d(i, j) = d(i-1, j)# 如果上边是障碍物,则d(i, j) = d(i, j-1)# 如果左边和上边都没有障碍物,则d(i, j) = d(i-1, j) + d(i, j-1)# 边界条件:# 如果i=0,若左边是障碍物,则d(i, j) = 0;若左边没有障碍物,则d(i, j)=d(i, j-1)# 如果j=0,若上边有障碍物,则d(i, j) = 0; 若上边没有障碍物,则d(i, j)=d(i-1, j)m = len(obstacleGrid) # 行数n = len(obstacleGrid[0]) # 列数# 定义二维矩阵d = [[-1 for j in range(n)] for i in range(m)]for i in range(m):for j in range(n):# 边界条件## 起始点默认为1条路径到达if i == 0 and j == 0:d[i][j] = 1## 如果在第一行elif i == 0:if obstacleGrid[i][j-1] == 1:d[i][j] = 0else:d[i][j] = d[i][j-1] ## 如果在第一列elif j == 0:if obstacleGrid[i-1][j] == 1:d[i][j] = 0else:d[i][j] = d[i-1][j]# 状态转移else:## 如果上边和左边都是障碍物if obstacleGrid[i-1][j] == 1 and obstacleGrid[i][j-1] == 1:d[i][j] = 0## 如果只有上边是障碍物elif obstacleGrid[i-1][j] == 1:d[i][j] = d[i][j-1]## 如果只有左边是障碍物elif obstacleGrid[i][j-1] == 1:d[i][j] = d[i-1][j]## 如果左边和上边都没有障碍物else:d[i][j] = d[i][j-1] + d[i-1][j]return d[m-1][n-1]

不同路径(I和II)--动态规划相关推荐

  1. 92. Leetcode 63. 不同路径 II (动态规划-路径规划)

    步骤一.确定状态: 确定dp数组及含义 dp[i][j]表示从左上角到第i行j列这个位置的路径条数 步骤二.推断状态方程 dp[i][j] = dp[i-1][j] + dp[i][j-1] 步骤三. ...

  2. LeetCode 63.不同路径II(动态规划)

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

  3. leetcode 64. 最小路径和(递归 / 动态规划解法图解)(Java版)

    题目 leetcode 64. 最小路径和 提示: m == grid.length n == grid[i].length 1 <= m, n <= 200 0 <= grid[i ...

  4. LeetCode 931. 下降路径最小和(动态规划)

    1. 题目 给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和. 下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素.在下一行选择的元素和当前行所选元素最多相隔一列. 示例 ...

  5. LeetCode 1289. 下降路径最小和 II(DP)

    1. 题目 给你一个整数方阵 arr ,定义「非零偏移下降路径」为:从 arr 数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列. 请你返回非零偏移下降路径数字和的最小值 ...

  6. 【LeetCode笔记】112 113. 路径总和 I II(Java、递归、DFS)

    文章目录 路径总和 I 路径总和 II 比较简单,就连着一起写了 路径总和 I 注意:一定得走到叶子才算 直接看代码吧,注释也就几行. /*** Definition for a binary tre ...

  7. 【LeetCode笔记】62. 不同路径(Java、动态规划)

    文章目录 题目描述 代码 & 思路 更新 2.0 版本 题目描述 一眼bfs,不过超时了... 好,那么我们就用动态规划来做! 代码 & 思路 和走迷宫差不多,从终点往起点走. dp[ ...

  8. 第二章第三节(上)路径决策算法(动态规划)

    这一节是根据参考线+障碍物实现避障的局部规划 这一节的理论,确定规划的起点是在frenet坐标系下的 哇塞每个规划周期下 这个参考线坐标都得换一次,这好烦呐: 撒点求粗解是在frenet坐标系下的, ...

  9. 每日一道Leetcode -网格矩阵中的路径相关系列【动态规划|路径中(不)含值|有无障碍物|最小路径和】

    class Solution:def uniquePaths(self, m: int, n: int) -> int:"""排列组合方法:从左上角到右下角的过程中 ...

  10. POJ 2336 Ferry Loading II 动态规划

    题意:一个渡河问题,船每次最多可以载n辆车,单程渡河的时间是t,有m辆车要渡河,问最少时间把所有车运过河去的时间是多少,这个情况下,最少的运输次数是多少. 分析:确实是动态规划,惭愧我想了很久,也没想 ...

最新文章

  1. BZOJ1433 [ZJOI2009]假期的宿舍 - 二分图匹配
  2. python实现交并比IOU
  3. UINavigationController
  4. 使用AWS Lambda在Go中构建RESTful API
  5. 比较Java REST文档框架
  6. Python拾遗1:collections、itertools和内存io
  7. python 有什么一般人不知道的缺点_关于python,你知道它的优缺点吗?
  8. note3 android system recovery,三星note3 N900v刷第三方rom
  9. 小怪掉落碎片及下级符文(灵晶)一览
  10. oozie控制台命令
  11. java虚拟机家族种类
  12. 液晶8K电视也能打造家庭影院?一起“宅”过电影情人节吧
  13. SpringBoot+Vue+Cas单点登录与登出
  14. 计算机无法 鼠标没反应,鼠标插电脑上没反应怎么回事_鼠标连接电脑没反应的解决步骤...
  15. OpenSSL爆出严重bug漏洞 Heartbleed bug CVE-2014-0160
  16. sfu计算机硕士,别告诉我你了解菲莎国际学院
  17. python报错:RuntimeError
  18. 神经网络中Epoch、Iteration、Batchsize相关理解和说明
  19. SAP月结在制品结算时不产生凭证的一个问题
  20. 小学计算机课教案表格,小学信息技术教学设计《插入表格》

热门文章

  1. sqlserver 分组合并列_【双11秒杀】帕克96分阿根廷一级名庄鼎尖单一园马尔贝克...
  2. hnu 暑期实训之到底买不买
  3. Tensorflow报错_np_qint8 = np.dtype([(“qint8“, np.int8, 1)])
  4. AcWing 100. 增减序列
  5. ShuffleNetV2论文译读笔记
  6. Android SDK Manager配置
  7. Megcup2017 Dogfood
  8. Java反编译工具:Java Decompiler
  9. [译]为什么Vue不支持templateURL
  10. 树莓派入门教程 - 0 - 准备篇 - 0.4 树莓派安装FTP服务器