刷题篇--不同路径问题

不同路径

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]					
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值