leetcode刷题-62不同路径

题目

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径?

思路

回溯:能够实现,不断向右或者向下,但是效率过低,无法通过

动态规划:

令 dp[i][j] 是到达 i, j 最多路径,因此动态方程为dp[i][j] = dp[i-1][j] + dp[i][j-1],其中第一行 dp[0][j]和第一列 dp[i][0],在边界,所以其值只能为 1、

进一步优化:每一格的值只与上一行有关,因此我们只要维护一行的值即可

实现

回溯:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        result = 0
        def step(x,y):
            if x < m-1:
                step(x+1,y)
            if y < n-1:
                step(x,y+1)
            if x == m -1 and y == n-1:
                nonlocal result
                result += 1
        step(0,0)
        return result

动态规划:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        matrix = [[0 for i in range(n)] for j in range(m)]
        for k in range(m):
            for j in range(n):
                if k < 1:
                    matrix[k][j] = 1
                elif j < 1:
                    matrix[k][j] = 1
                else:
                    matrix[k][j] = matrix[k-1][j] + matrix[k][j-1]
        return matrix[m-1][n-1]

优化:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        matrix = [1 for i in range(n)]
        for k in range(1,m):
            for j in range(1,n):
                    matrix[j] += matrix[j-1]
        return matrix[n-1]

 

posted @ 2020-08-06 11:24  maoguai  阅读(116)  评论(0编辑  收藏  举报