leetcode【62】----不同路径【Python】【动态规划】

题目描述

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

 

代码实现

动态规划解法

  • 自顶向下先用递归思考:函数可以抽象为走到终点(m-1,n-1)的全部走法。而递归为子问题,分别为(m-2, n-1)与(m-1, n-2)两点走出的方法。
  • 状态转移方程:F(m-1,n-1) = F(m-2, n-1)+ F(m-1, n-2)
  • 自底向上思考:F(0,0) = 1 F(1,0) = F(0,0) F(0,1) = F(0,0) F(1,1)= F(0,1)+F(1,0) ...F(m-1,n-1) = F(m-2, n-1)+ F(m-1, n-2)
  • 下边界, 右边界单独处理
  • 迭代即可动态规划求解。
 way[i][j]=way[i-1][j]+way[i][j-1];

		0       1        1        1       1
		1	2	 3	  4	  5
		1	3	 6	  10	  15
		1	4	 10	  20	  35
		1	5	 15	  35	  70
class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        if m==1 or n==1:
            return 1
        way=[[1]*m for i in range(n)]
        for i in range(1,n):
            for j in range(1,m):
                way[i][j]=way[i-1][j]+way[i][j-1]
        return way[-1][-1]   

数学方法

根据棋盘形状,推算出向右需要走m-1步,向下需要走n-1步,而我们需要走入最后一个网格,也就是说我们要在一共能走的步数中选m-1步往右,其余向下走。等同于高中学过的排列组合。

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        return math.factorial(m+n-2)//(math.factorial(m-1)*math.factorial(n-1))

猜你喜欢

转载自blog.csdn.net/weixin_42702666/article/details/89356865
今日推荐