乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。
機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。
問總共有多少條不同的路徑?
例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?
示例 1:
輸入: m = 3, n = 2示例 2:輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。
向右 -> 向右 -> 向下
向右 -> 向下 -> 向右
向下 -> 向右 -> 向右
輸入: m = 7, n = 3動態規劃解決注意這裡機械人只能向下和向右移動,不能往其他方向移動,我們用dp[i][j]表示到座標(i,j)這個格內有多少條不同的路徑,所以最終的答案就是求dp[m-1][n-1]。輸出: 28
因為只能從上面或左邊走過來,所以遞推公式是
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 問總共有多少條不同的路徑?本質上就是乙個 楊輝三角。這是個楊輝三角形,每個位置的路徑 該位置左邊的路徑 該位置上邊的路徑 動態...