不同路径
leetcode 62. 不同路径、leetcode 63. 不同路径 II 是经典的动态规划问题,从网格中找到从初始位置到结束位置的所有可能路径。动态规划问题可以理解成选择问题,我们怎么去选择从而得到需要的解。另外需要考虑其中的细节,如边界等。
1.不同路径
一个机器人位于一个 m x n 网格的左上角,机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,那么总共有多少种路径可以选择。
首先是该题的边界,机器人可以向右和向下,那么路径中初始的第一行和第一列都是1(说明可以走),之后就是路径选择问题,如要走到某一个格子dp[i][j],可以从它的上一格走,也可以从左一格走,都是可能的路径,所以它的状态转移方程是dp[i][j]=dp[i-1][j]+dp[i][j-1]。
def uniquePaths(m, n):
dp = [[0]*n for _in range(m)] #构造dp矩阵,记录到每一个格子可能的路径数
for i in range(m): #边界设置
dp[i][0] = 1
for j in range(n):
dp[0][j] = 1
for i in range(1, m):
for j in range(1, n):
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return dp[-1][-1]
2.不同路径II
该题与上一题的区别在于加入了障碍物,如果存在障碍物,我们则不能通过该路径。同样的我们构造dp矩阵去记录,此时我们不能直接设置边界为1了,因为有可能边界上也有障碍物。最极端的情况是障碍物在左上角,此时寸步难行。这些都是我们需要去考虑到的条件,如在第一行,那么不能从上一格向下,只能从左一格向右走。
def uniquePathsWithObstacles(obstacleGrid):
m, n = len(obstacleGrid), len(obstacleGrid[0])
dp = [[0]*n for _ in range(m)]
for i in range(m):
for j in range(n):
if obstacleGrid[i][j] != 1: #若没有障碍物
if i == j == 0:
dp[i][j] = 1 #判断左上角,从而赋初值
else:
if i != 0: #需判断边界,从上一格下来是否可行(如果i为0,则只能从左一格过来)
a = dp[i-1][j]
else:
a = 0
if j != 0: #需判断边界,从左一格过来是否可行
b = dp[i][j-1]
else:
b = 0
dp[i][j] = a + b
#有障碍物则continue跳过该格子
return dp[-1][-1]