411,動態規劃和遞迴求不同路徑 II

2022-09-18 09:48:16 字數 3399 閱讀 3552

乙個機械人位於乙個 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...