这道题最直观的dp思路其实就是填满一张二维表 d p dp dp即可,二维表的大小为 m × n m\times n m×n。二维表中的元素 d p [ m ] [ n ] dp[m][n] dp[m][n]表示从起始点到达坐标为 ( m , n ) (m,n) (m,n)位置的所有不同路径的总数。
状态转移的方程为:
d
p
[
m
]
[
n
]
=
d
p
[
m
−
1
]
[
n
]
+
d
p
[
m
]
[
n
−
1
]
dp[m][n] = dp[m-1][n] + dp[m][n-1]
dp[m][n]=dp[m−1][n]+dp[m][n−1]
状态转移矩阵的初始化:
对于第一行
d
p
[
0
]
[
j
]
,
j
=
1
,
2
,
⋯
,
n
−
1
dp[0][j],\quad j=1,2,\cdots,n-1
dp[0][j],j=1,2,⋯,n−1
或者第一列
d
p
[
i
]
[
0
]
,
i
=
1
,
2
,
⋯
,
m
−
1
dp[i][0], \quad i=1,2,\cdots,m-1
dp[i][0],i=1,2,⋯,m−1
由于都是在边界,所以只能为 1
具体代码为:
import numpy as np
class Solution(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
"""
对于第一行 dp[0][j],或者第一列 dp[i][0],由于都是在边界,所以只能为 1
dp[m][n] = dp[m-1][n] + dp[m][n-1]
"""
dp = np.ones((m+1, n+1))
for i in range(2, m+1):
for j in range(2, n+1):
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return int(dp[m][n])
solution = Solution()
print(solution.uniquePaths(7, 3))
本题其实还有很多的优化思路,比如将这个问题看做排列组合问题,或者对时间复杂度和空间复杂度进行优化,具体优化方法见大佬的题解:https://leetcode-cn.com/problems/unique-paths/solution/dong-tai-gui-hua-by-powcai-2/