2. 不同路径(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:整体思路是一样的,找到状态转移公式和初始化处理。不过这题开始dp数组变成了二维,需要着重考虑初始话特殊条件判断。
int uniquePaths(int m, int n){vector<vector<int>> dp(m, vector<int>(n, 0));for(int i=0; i<n; i++) dp[0][i]=1;for(int i=0; i<m; i++) dp[i][0]=1;for(int i=1; i<m; i++){for(int j=1; j<n; j++){dp[i][j] = dp[i][j-1] + dp[i-1][j];}}return dp[m-1][n-1];
}
63. 不同路径 II(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:遇到障碍dp[i][j]就赋值0,其他都是类似。比较容易漏掉的一点是,初始化的时候,也就是给dp数组第一行和第一列全部赋值1的时候要判断途中是否出现障碍物,若出现,后面的位置就都到不了,需要全部赋值为0.
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<n && obstacleGrid[0][i]==0; i++) dp[0][i]=1;for(int i=0; i<m && obstacleGrid[i][0]==0; i++) dp[i][0]=1;for(int i=1; i<m; i++){for(int j=1; j<n; j++){if(obstacleGrid[i][j] == 1) dp[i][j] = 0;else dp[i][j] = dp[i][j-1] + dp[i-1][j];}}return dp[m-1][n-1];
}