当前位置:首页 > 编程笔记 > 正文
已解决

动态规划 Ⅱ

来自网友在路上 167867提问 提问时间:2023-09-21 21:53:16阅读次数: 67

最佳答案 问答题库678位专家为你答疑解惑

62. 不同路径

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

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

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

思路:dp[i][j] = dp[i-1]dp[j] + dp[ i] + dp[j-1],  dp[i][j] = 0 when i=0 or j = 0. dp数组可优化为滚动数组

python,滚动数组

class Solution:def uniquePaths(self, m: int, n: int) -> int:dp = [1 for _ in range(n)]for i in range(1, m):for j in range(1,len(dp)):dp[j] += dp[j-1]return dp[-1]

63. 不同路径 II

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

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

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

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

思路,转移方程与不同路径Ⅰ类似,但是要注意障碍物的存在,dp数组时,对应的位置置为0,且dp数组不会在这个位置上更新。初始第一行或第一列时,遇到障碍物后面的位置默认置零。

python:二维数组

class Solution:def uniquePathsWithObstacles(self, obstacleGrid):m = len(obstacleGrid)n = len(obstacleGrid[0])if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1:return 0dp = [[0] * n for _ in range(m)]for i in range(m):if obstacleGrid[i][0] == 0:  # 遇到障碍物时,直接退出循环,后面默认都是0dp[i][0] = 1else:breakfor j in range(n):if obstacleGrid[0][j] == 0:dp[0][j] = 1else:breakfor i in range(1, m):for j in range(1, n):if obstacleGrid[i][j] == 1:continuedp[i][j] = dp[i - 1][j] + dp[i][j - 1]return dp[m - 1][n - 1]

Python:滚动数组

class Solution:def uniquePathsWithObstacles(self, obstacleGrid):if obstacleGrid[0][0] == 1:return 0m, n = len(obstacleGrid), len(obstacleGrid[0])dp = [0] * n  # 初始化第一行的路径数for j in range(n):if obstacleGrid[0][j] == 1:breakdp[j] = 1# 计算其他行的路径数,根据障碍物的dp数组修改优先级最高for i in range(1, m):if obstacleGrid[i][0] == 1:dp[0] = 0for j in range(1, n):if obstacleGrid[i][j] == 1:dp[j] = 0continuedp[j] += dp[j - 1]return dp[-1]  # 返回最后一个元素,即终点的路径数

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"动态规划 Ⅱ":http://eshow365.cn/6-10992-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!