1.不同路徑
代碼隨想錄
視頻講解:動態規劃中如何初始化很重要!| LeetCode:62.不同路徑_嗶哩嗶哩_bilibili
代碼:
class Solution {
public:int uniquePaths(int m, int n) {// dp[i][j] 表示從起點走到坐標為i,j的地方的方法數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];}
};
?思路:
dp數組的含義:從起點走到坐標為i,j的方法數
遞推公式:因為只能向右或向下走,所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
初始化:因為是由左方的方法數,和上方的方法數推出來的,因此,我們只需要初始化最上方的行,和最左邊的列。而我們的dp數組的含義是方法數,因此,它們全部初始化為1.
遍歷順序:從上到下,從左到右
這道題,我還是出錯了,雖然我遞推公式寫對了,但是我在初始化的時候,沒有想到我的dp數組表示方法數,我寫成了步數。
2.不同路徑2
代碼隨想錄視頻講解:https://www.bilibili.com/video/BV1Ld4y1k7c6
代碼:?
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();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] == 0){dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}return dp[m - 1][n - 1];}
};
?思路:
dp數組的含義:從起點走到坐標為i,j的方法數
遞推公式:因為只能向右或向下走,所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
初始化:因為是由左方的方法數,和上方的方法數推出來的,因此,我們只需要初始化最上方的行,和最左邊的列。而我們的dp數組的含義是方法數,因此,它們全部初始化為1.
遍歷順序:從上到下,從左到右
?和上一題的區別主要體現在初始化和遞推公式上,在初始化時,如果遇到了障礙,就應該停止初始化(這樣沒有被初始化的dp元素默認為0種方法);在遞推時,加上判斷條件,判斷我們的目標地點沒有障礙時,再進行遞推。