一个机器人位于一个
m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
提示:
- 1 <= m, n <= 100
- 题目数据保证答案小于等于 2 * 109
解1 2021/9/9 O(mxn)
def udpate_shang_zuo(dp:list, x:int, y:int, m:int, n:int) -> None:
# 更新上格
if x>0 and dp[x-1][y]==0:
# =0的就别处理了,说明还没准备好
if dp[x][y]==0 or (y<n-1 and dp[x-1][y+1]==0): return
dp[x-1][y]+=dp[x][y]
if y<n-1:
dp[x-1][y]+=dp[x-1][y+1]
udpate_shang_zuo(dp, x - 1, y, m, n)
# 更新左格
if y>0 and dp[x][y-1]==0:
# =0的就别处理了,说明还没准备好
if dp[x][y]==0 or (x<m-1 and dp[x+1][y-1]==0): return
dp[x][y-1]+=dp[x][y]
if x<m-1:
dp[x][y-1]+=dp[x+1][y-1]
udpate_shang_zuo(dp, x, y - 1, m, n)
# 从调试看,=0不处理,最终结果是对的,不会中途停掉,不会漏,暂时没有理解
def uniquePaths(m: int, n: int) -> int:
# 也是dp
# 从[x,y]位置出发,要么向右,要么向下,不能斜着走,碰壁就一个方向
# f(x,y)=f(x,y+1)+f(x+1,y)
# m,n∈[1,100]
if m==1 or n==1: return 1
dp=[[0 for x in range(0,n)] for y in range(0,m)]
x=m-1;y=n-1
dp[x][y]=1
# 从某个位置,可以推出上面和左边,得递归了,推到全是墙为止
udpate_shang_zuo(dp,x,y,m,n)
return dp[0][0]
if __name__ == '__main__':
# 28
m = 3;n = 7
print(uniquePaths(m,n))
# 28
m = 7;n = 3
print(uniquePaths(m,n))
# 6
m = 3;n = 3
print(uniquePaths(m,n))
m = 1;n = 3
print(uniquePaths(m,n))
m = 3;n = 1
print(uniquePaths(m,n))
m = 9;n = 2
print(uniquePaths(m,n))
我发现,我dp的解法全部都很低效!