动态规划例题(一)

一、leetcode地址

leetcode地址:https://leetcode-cn.com/problems/unique-paths/

二、题目:不同路径

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

三、解法

1、数学公式法

算法本就是数学的一部分,这种套用数学公式的解法可是非常爽的,最重要的是“简”。
排列组合的公式
(C_n^m)= ({A_n^m } over {m! })= ({n!} over {m!(n-m)!})
在这里机器从左上角到右下角,向左和向右的步数都是固定的,所以可以表示为:
(C_{m+n-2}^{m-1})
用python代码来实现如下:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        #使用排列组合公式
        return int(math.factorial(m+n-2)/math.factorial(m-1)/math.factorial(n-1))

2、动态规划法

动态规划方程:dp[i][j]=dp[i-1][j]+dp[i][j-1]
第一行dp[0][j]和第一列dp[i][0]都是边界,定义为1
用python代码实现如下:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        #套用dp方程
        dp =[[1]*n]+[[1]+[0]*(n-1) for _ in range(m-1)]
        #print(dp)
        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]

dp代码优化,只需要记录每一行的值即可,代码如下:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        #dp优化方案
        dp=[1]*n
        for i in range(1,m):
            for j in range(1,n):
                dp[j] += dp[j-1]
        return dp[-1]
原文地址:https://www.cnblogs.com/lvsling/p/14418778.html