不同路径II
思路
確定dp數組(dp table)以及下標的含義
dp[i][j] :表示從(0 ,0)出發,到(i, j) 有dp[i][j]條不同的路徑。
確定遞推公式
遞推公式和62.不同路徑一樣,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。
但需要注意,由于有了障礙,(i, j)如果就是障礙的話應該就保持初始狀態(初始狀態為0)。
所以代碼為:
if (obstacleGrid[ii][jj] == 0) { // 當(ii, jj)沒有障礙的時候,再推導dp[i][j]dp[ii][jj] = dp[ii - 1][jj] + dp[ii][jj - 1]; }dp數組如何初始化
在62.不同路徑中的初始化:
vector<vector<int>> dp(m, vector<int>(n, 0)); // 初始值為0 for (int i = 0; i < m; i++) dp[i][0] = 1; for (int j = 0; j < n; j++) dp[0][j] = 1;因為從(0, 0)的位置到(i, 0)的路徑只有一條,所以dp[i][0]一定為1,dp[0][j]也同理。
但如果(i, 0) 這條邊有了障礙之后,障礙之后(包括障礙)都是走不到的位置了,所以障礙之后的dp[i][0]應該還是初始值0。
所以本題初始化代碼為:
確定遍歷順序
從遞歸公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是從左到右一層一層遍歷,這樣保證推導dp[i][j]的時候,dp[i - 1][j] 和 dp[i][j - 1]一定是有數值。
代碼如下:
for(int ii=1;ii<m;ii++){for(int jj=1;jj<n;jj++){if(obstacleGrid[ii][jj]==0) dp[ii][jj]=dp[ii-1][jj]+dp[ii][jj-1];}}舉例推導dp數組
拿示例1來舉例如題:
總結