409,動態規劃求不同路徑

2022-09-18 09:48:15 字數 3161 閱讀 8793

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

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

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

例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?

示例 1:

輸入: m = 3, n = 2

輸出: 3

解釋:

從左上角開始,總共有 3 條路徑可以到達右下角。

向右 -> 向右 -> 向下

向右 -> 向下 -> 向右

向下 -> 向右 -> 向右

示例 2:

輸入: m = 7, n = 3

輸出: 28

動態規劃解決注意這裡機械人只能向下和向右移動,不能往其他方向移動,我們用dp[i][j]表示到座標(i,j)這個格內有多少條不同的路徑,所以最終的答案就是求dp[m-1][n-1]。

因為只能從上面或左邊走過來,所以遞推公式是

dp[i][j]=dp[i-1][j]+dp[i][j-1]。

dp[i-1][j]表示的是從上面走過來的路徑條數。

dp[i][j-1]表示的是從左邊走過來的路徑條數。

那麼邊界條件是什麼呢,如果finish在第一行的任何位置都只有一條路徑,同理finish在第一列的任何位置也都只有一條路徑,所以邊界條件是第一行和第一列都是1。我們已經找到了遞推公式,又找到了邊界條件,所以動態規劃**很容易寫出來,我們來看下

public

intuniquepaths

(int m,

int n)

//第一行都是1

for(

int i =

0; i < n; i++

)//這裡是遞推公式

for(

int i =

1; i < m; i++

)for

(int j =

1; j < n; j++

) dp[i]

[j]= dp[i -1]

[j]+ dp[i]

[j -1]

;return dp[m -1]

[n -1]

;}

動態規劃優化我們看上面二維陣列的遞推公式,當前座標的值只和左邊與上面的值有關,和其他的無關,這樣二維陣列造成大量的空間浪費,所以我們可以把它改為一維陣列。

public

intuniquepaths

(int m,

int n)

這裡的dp[i]+=dp[i-1];實際上就是dp[i]=dp[i]+dp[i-1],我們可以這樣理解,上面的網格我們是一行一行計算的,**dp[i]**也就是上面深色的表示的是當前位置上面的值,dp[i-1]表示的是當前位置左邊的值。

遞迴方式

這題除了動態規劃以外,還可以把上面的動態規劃改為遞迴的方式

public

intuniquepaths

(int m,

int n)

//第i行第j列到第m行第n列共有多少種路徑

public

intuniquepathshelper

(int i,

int j,

int m,

int n)

**中有注釋,很容易理解,但其實這種效率很差,因為他包含了大量的重複計算,我們畫個圖來看一下。

我們看到上面圖中紅色,黑色,還有那種什麼顏色的都表示重複的計算,所以有一種方式就是把計算過的值使用乙個map儲存起來,用的時候先檢視是否計算過,如果計算過就直接拿來用,看下**

public

intuniquepaths

(int m,

int n)

public

intuniquepathshelper

(int i,

int j,

int m,

int n, map

map)

使用公式計算我們要想到達終點,需要往下走n-1步,往右走m-1步,總共需要走n+m-2步。他無論往右走還是往下走他的總的步數是不會變的。也就相當於總共要走n+m-2步,往右走m-1步總共有多少種走法,很明顯這就是乙個排列組合問題,公式如下

排列組合的計算公式如下

公式為(m+n-2)! / [(m-1)! * (n-1)!]

**如下

public

intuniquepaths

(int m,

int n)

總結這題使用動態規劃是最容易理解也是最容易解決的,當然後面的遞迴和公式計算也能解決。

動態規劃 不同路徑

乙個機械人位於乙個 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 問總共有多少條不同的路徑?本質上就是乙個 楊輝三角。這是個楊輝三角形,每個位置的路徑 該位置左邊的路徑 該位置上邊的路徑 動態...