一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?

示例 1:
Leetcode - 62. 不同路径_商业

输入: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))

Leetcode - 62. 不同路径_数据_02

我发现,我dp的解法全部都很低效!