Day28 OK,今日份的打卡!第二十八天
- 以下是今日份的總結
- 不同路徑
- 不同路徑 II
以下是今日份的總結
62 不同路徑
63 不同路徑 II
今天的題目難度不低,盡量還是寫一些簡潔代碼 ^?_?^
不同路徑
思路:
1.確定dp數組(dp table)以及下標的含義
dp[i][j] :表示從(0 ,0)出發,到(i, j) 有dp[i][j]條不同的路徑。
2.確定遞推公式
----想要求dp[i][j],只能有兩個方向來推導出來,即dp[i - 1][j] 和 dp[i][j - 1]。
----此時在回顧一下 dp[i - 1][j] 表示啥,是從(0, 0)的位置到(i - 1, j)有幾條路徑,dp[i][j - 1]同理。
----那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因為dp[i][j]只有這兩個方向過來。
3.dp數組的初始化
----如何初始化呢,首先dp[i][0]一定都是1,因為從(0, 0)的位置到(i, 0)的路徑只有一條,那么dp[0][j]也同理。
----for (int i = 0; i < m; i++) dp[i][0] = 1;
----for (int j = 0; j < n; j++) dp[0][j] = 1;
4.確定遍歷順序
這里要看一下遞推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是從其上方和左方推導而來,那么從左到右一層一層遍歷就可以了。
這樣就可以保證推導dp[i][j]的時候,dp[i - 1][j] 和 dp[i][j - 1]一定是有數值的。
5.舉例推導dp數組
m = 3 , n = 7
1 1 1 1 1 1 1
1 2 3 4 5 6 7
1 3 6 10 15 21 28
值得注意的是
注意動態規劃的五個步驟
int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n, 0));for(int i = 0; i<m;i++) dp[i][0] = 1;for(int j = 0; j<n;j++) dp[0][j] = 1;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];//從[0,0]開始}
不同路徑 II
思路:
和上題思路是一樣的
值得注意的是
遍歷賦值的時候多加一個判斷條件跳過obstacleGrid中值為1 的部分即可
無論如何都要用dp數組重寫
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();if (obstacleGrid[m - 1][n - 1] == 1 ||obstacleGrid[0][0] == 1) // 如果在起點或終點出現了障礙,直接返回0return 0;vector<vector<int>> dp(m, vector<int>(n, 0));for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++)dp[i][0] = 1;for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++)dp[0][j] = 1;for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (obstacleGrid[i][j] == 1)continue;dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
寫在最后
----OK,今日份的博客就寫到這里,這一期的貪心算法好難想,明天繼續加油!!!
—還沒看下期的題,但是我的棧還有一節沒寫;
–追上時間進度了!!(笑
-扭一扭,轉一轉,又是健康滴一天😊。