力扣日記 062 不同路徑 動態規劃

2021-10-02 16:07:20 字數 3589 閱讀 2144

乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。

機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。

問總共有多少條不同的路徑?

易知start——>finish需要m+n-2個小方格,一定會有n-1個小方格是向右,m-1個方格向下。所能得到的不同路徑即從m+n-2個方格中挑選出m-1個向下的組合問題:

c (m

−1m+

n−2)

=(m+

n−2)

!(m−

1)!∗

(n−1

)!c\binom =\frac

c(m+n−

2m−1

​)=(

m−1)

!∗(n

−1)!

(m+n

−2)!

class

solution

:def

uniquepaths

(self, m:

int, n:

int)

->

int:

deffactor

(num)

: res =

1for i in

range(1

, num+1)

: res *= i

return res

ans = factor(m+n-2)

//(factor(m-1)

* factor(n-1)

)return ans

執行用時 :28 ms, 在所有 python3 提交中擊敗了93.11%的使用者

記憶體消耗 :13.1 mb, 在所有 python3 提交中擊敗了54.27%的使用者

math庫

def

uniquepaths

(self, m:

int, n:

int)

->

int:

return

int(math.factorial(m+n-2)

/math.factorial(m-1)

/math.factorial(n-1)

)

所謂動態規劃,即求解決策過程(decision process)最優化的數學方法。把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解。

動態規劃的適用條件:必須滿足最優化原理無後效性

最優化原理:乙個最優化策略具有這樣的性質,不論過去狀態和決策如何,對前面的決策所形成的狀態而言,餘下的諸決策必須構成最優策略。簡而言之,乙個最優化策略的子策略總是最優的。乙個問題滿足最優化原理又稱其具有最優子結構性質

無後效性:對於某個給定的階段狀態,它以前各階段的狀態無法直接影響它未來的決策,而只能通過當前的這個狀態。

雖然題目標籤有動態規劃,但是看題解我是懵逼的,直到我看到了這一篇:小學題。

對於mxn的表,從start出發要到達最左邊和最上面的格仔,都只有一條路徑。

#**數字表示路徑數

對於任一空白格,所能到達的路徑即是左邊和上面格仔路徑數的總和。

由此,易得動態規劃演算法:

1、給出**:dp=[[1]*n] +[[1]+[0]*(n-1) for _ in range(m-1)]

2、dp[i][j]=dp[i][j-1]+dp[i-1][j]

class

solution

:def

uniquepaths

(self, m:

int, n:

int)

->

int:

dp=[[

1]*n]+[[

1]+[

0]*(n-1)

for _ in

range

(m-1)]

for 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

]

執行用時 :36 ms, 在所有 python3 提交中擊敗了59.99%的使用者

記憶體消耗 :13.2 mb, 在所有 python3 提交中擊敗了53.41%的使用者

空間複雜度為o(mn)

二維陣列優化為一維陣列的方法:

由於最右邊界都為1,即整個最右邊界的取值都可以用dp[0][0]來替代

第一層for-i迴圈用作計數;第二層for-j迴圈進行動態規劃。

每一次迴圈都是更新源列表。

]

執行用時 :28 ms, 在所有 python3 提交中擊敗了93.02%的使用者

記憶體消耗 :13 mb, 在所有 python3 提交中擊敗了53.82%的使用者

力扣 動態規劃 不同路徑

描述 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 100。...

力扣 65不同路徑

最近在刷力扣上的題目,刷到了65不同路徑,當初上大學的時候,曾在hihocoder上刷到過這道題目,但是現在已經幾乎全忘光了,大概的知識點是動態規劃,如今就讓我們一起來回顧一下。題目原文是 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動...

力扣62 不同路徑

乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?示例 1 輸入 m 3,n 7 輸出 28 示例 2 輸入 m 3,n 2 輸出 3 解釋 從左上角...