1、題目鏈結
知乎動態規劃理解
乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。 問總共有多少條不同的路徑?
輸入: m = 3, n = 2
輸出: 3
解釋:從左上角開始,總共有 3 條路徑可以到達右下角。
向右 -> 向右 -> 向下
向右 -> 向下 -> 向右
向下 -> 向右 -> 向右
2、分析
題目要求計算從某乙個點到另乙個點的行走的幾種方式,此題可以使用動態規劃來解,目標點(0, 0)到(i, j)的距離是,i-0 + j-0,使用動態規劃的幾個步驟有,1、分析動態規劃所屬的型別,2、建立狀態轉移方程 3、建立快取空間,此題的轉移方程為: f(i, j) = results[i][j-1] + results[i-1][j], results[i][j] 為上一步的快取位址,例如,如果讓你計算 1 + … 101 你肯定不會馬上計算出來,但是我們現在已知 1+…100的值,那麼將這個值存入到快取中,如果在計算1+…101 只需要在快取的基礎上+1即可。
3、**
class
solution
:def
uniquepaths
(self, m:
int, n:
int)
->
int:
results =[[
1]* n ]
* m # 用作儲存快取
for i in
range(1
, m)
:for j in
range(1
, n)
: results[i]
[j]= results[i]
[j-1
]+ results[i-1]
[j]return results[-1
][-1
]
斐波那契數列的動態規劃:
def
count_paths
(num)
:# 1 1 2 3 5
# 快取空間
results =
# 狀態轉移方程 results[i] = results[i-1] + results[i-2]
for i in
range
(num)
:if i <2:
1)else:1
]+ results[i-2]
)print
(results)
4、結果
執行用時 :
32 ms, 在所有 python3 提交中擊敗了88.45
% 的使用者
記憶體消耗 :
12.8 mb, 在所有 python3 提交中擊敗了98.84
%的使用者
5、優化在類似的動態規劃題中,可以優化記憶體的大小,此題中感覺沒有優化點的存在。
望您:
「情深不壽,強極則辱,謙謙君子,溫潤如玉」。
62 不同路徑63 不同路徑 II
62.不同路徑 動態規劃清晰步驟 1.定義dp陣列 2.初始化 3.迴圈填充 4.返回結果 class solution 4.返回結果 return dp m 1 n 1 動態規劃寫法2 內部解決初始化問題 class solution2 else if i 0 j 0 else if i 0 j ...
62 不同路徑
一 題目 機械人位於乙個 m x n 網格的左上角,在下圖中標記為 start 開始 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角,在下圖中標記為 finish 結束 問有多少條不同的路徑?例如,上圖是乙個3 x 7網格。有多少可能的路徑?注意 m 和 n 的值均不超過 100。二...
62 不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 100。示例 ...