动态规划例题(一)
一、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]