乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。
機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。
現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?
網格中的障礙物和空位置分別用 1 和 0 來表示。
說明:m 和 n 的值均不超過 100。
示例 1:
輸入:動態規劃解決這裡的遞推分為兩種情況,一種是當前網格沒有障礙物,一種是當前網格有障礙物。[0,0,0],
[0,1,0],
[0,0,0]
輸出: 2
解釋:
3x3 網格的正中間有乙個障礙物。
從左上角到右下角一共有 2 條不同的路徑:
向右 -> 向右 -> 向下 -> 向下
向下 -> 向下 -> 向右 -> 向右
1,如果當前網格dp[i][j]有障礙物,那麼這裡肯定是走不過去的,所以dp[i][j]=0。
2,如果當前網格dp[i][j]沒有障礙物,那麼遞推公式就和上一題409,動態規劃求不同路徑一樣了。
因為只能從上面或左邊走過來,所以遞推公式是
dp[i][j]=dp[i-1][j]+dp[i][j-1]。
邊界條件也好判斷,如果當前行沒有障礙物,那麼當前行的值都是1,如果有障礙物,那麼第乙個障礙物前面都是1,其他的都是0。同理第一列也一樣。
我們來看下**
public
intuniquepathswithobstacles
(int
obstaclegrid)
//第一行初始化
for(
int i =
0; i < n; i++
)for
(int i =
1; i < m;
++i)
for(
int j =
1; j < n;
++j)
if(obstaclegrid[i]
[j]==0)
dp[i]
[j]= dp[i -1]
[j]+ dp[i]
[j -1]
;return dp[m -1]
[n -1]
;}
**和409,動態規劃求不同路徑差不多,只不過在第一行和第一列還有上面第21行多了一些判斷。
動態規劃**量優化
上面**雖然也能實現,但有那麼多條件判斷總感覺很繁瑣,所以我們還有一種方式就是把二維陣列的長和寬都放大一格,這樣陣列的第一行和第一列都不儲存任何值,但初始條件要變了
上面3種初始條件都可以,我們來任選乙個,看下**
public
intuniquepathswithobstacles
(int
obstaclegrid)
動態規劃空間優化我們可以參照上一題把二維空間改為一維的,原理很簡單,我們來直接看**
public
intuniquepathswithobstacles
(int
obstaclegrid)
else}}
return dp[n]
;}
上一題有人問過乙個問題說看不懂第11行,這裡再說一下,因為是一行一行的遍歷,在當前行遍歷之前dp(這裡是一維陣列)表示的是上一行的值,然後遍歷到當前行的時候,假如遍歷當前行的第j列的時候,那麼當前行第j列之前的資料都會被更新掉,當前行第j列之後的資料還是上一行的,所以dp[j]=dp[j]+dp[j-1](為了區分,這裡標成了不同的顏色),**dp[j]**表示的是當前列的上一行值,dp[j-1]表示的是當前行的前乙個值。
遞迴方式
上一題我們提到過,使用遞迴的方式會造成大量的重複計算,所以為了減少重複計算,這裡使用乙個map把計算過的值儲存起來,下次用的時候先從map中取,如果有就返回,如果沒有再計算。
public
intuniquepathswithobstacles
(int
obstaclegrid)
public
static
inthelper
(int
obstaclegrid,
int down,
int right, map
map)
if(right == obstaclegrid[0]
.length -
1&& down == obstaclegrid.length -1)
else
map.
put(key, result)
;return result;}if
(right == obstaclegrid[0]
.length -
1|| down == obstaclegrid.length -1)
else
map.
put(key, result)
;return result;
} result =
helper
(obstaclegrid, down, right +
1, map)
+helper
(obstaclegrid, down +
1, right, map)
; map.
put(key, result)
;return result;
}
這種不看也可以,因為動態規劃非常簡單,沒人會傻到會使用這種方式,但他也算是提供了一種思路,有時間看看也行。
總結
這題多了乙個障礙物的判斷,但難度其實並沒有增加多少,如果當前位置出現了障礙物,說明不能從當前位置通過,所以當前位置的路徑是0,如果當前位置不是0,那麼計算就還和以前一樣了。
409,動態規劃求不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?示例 1 輸入 m 3,n 2 輸出 3 解釋...
動態規劃 不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img yrgqqaoc 1607527...
動態規劃 不同路徑(I,II
不同路徑 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 10...