乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為 「start」 )。
機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為 「finish」 )。
問總共有多少條不同的路徑?
示例 1:
輸入:m = 3, n = 2
輸出:3
解釋:從左上角開始,總共有 3 條路徑可以到達右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
從題目中應該能看出,該題是典型的網格類的座標型動態規劃和計數型動態規劃。
我們的最終目的是為了到達右下角,假設右下角座標為(n-1,m-1),因此最後一步要麼(n-2,m-1)向下要麼(n-1,m-2)向右。
如果倒數第二步在(n-1,m-2)那麼,前面一定記錄了從(0,0)到(n-1,m-2)所有路徑。
如果倒數第二步在(n-2,m-1)那麼,前面一定記錄了從(0,0)到(n-2,m-1)所有路徑。
上面描述了最後一步和子問題則可以確定狀態:f[i][j]表示從(0,0)到(i,j)的所有路徑方式
f[i][j]表示從(0,0)到(i,j)的所有路徑方式
初始條件:f[0][0]=1,因為機械人只有一種方式到達左上角
邊界情況:i=0或者j=0,則前面只有乙個方向過來,f[i][j]=1
還是逐行計算。
時間複雜度:o(mn),空間複雜度:o(mn)
這裡我才用了三種方式實現,注意對比。
class
solution
:def
uniquepaths
(self, m:
int, n:
int)
->
int:
dp =[[
0]*n for i in
range
(m)]
for i in
range
(m):
dp[i][0
]=1for i in
range
(n):
dp[0]
[i]=
1for i in
range(1
,m):
for j in
range(1
,n):
dp[i]
[j]=dp[i]
[j-1
]+dp[i-1]
[j]return dp[m-1]
[n-1
]class
solution
:def
uniquepaths
(self, m:
int, n:
int)
->
int:
dp=[1
]*nfor i in
range(1
,m):
for j in
range(1
,n):
dp[j]
+=dp[j-1]
print
(dp)
return dp[-1
]#採用組合數學的方式:
class
solution
:def
uniquepaths
(self, m:
int, n:
int)
->
int:
return comb(m + n -
2, n -
1)
動態規劃 不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img yrgqqaoc 1607527...
動態規劃 不同路徑(I,II
不同路徑 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 10...
62 不同路徑 動態規劃
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?本質上就是乙個 楊輝三角。這是個楊輝三角形,每個位置的路徑 該位置左邊的路徑 該位置上邊的路徑 動態...