【代码随想录day 34】 力扣 62.不同路径II
视频讲解:https://www.bilibili.com/video/BV1Ld4y1k7c6/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.html#%E6%80%9D%E8%B7%AF
力扣题目:https://leetcode.cn/problems/unique-paths-ii/
和上一道题思路一样,不同点在于,初始化时如果遇到障碍物,后续dp全为0,在遍历dp是如果遇到障碍物,将dp[][]置为0.
- dp含义,dp[i][j]表示到达(i, j)这个点有多少种不同的路径
- 递推公式,因为(i, j)只能由上点(i - 1, j)或左点(i, j - 1)得到,所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1];但需要注意的是,这道题中出现了障碍物,如果(i, j)是障碍物的话dp[i][j] = 0
- 初始化,因为所有的点都是由最左一列和最上一行推导出来的,所以最左一列和最上一行全部赋值为1,如果有障碍物的话,从当前节点到之后全为0
- 遍历顺序,从上往下,从左往右
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {//计算几行几列int m = obstacleGrid.size();int n = obstacleGrid[0].size();//1. dp含义,dp[i][j]表示到达(i, j)这个点有多少种不同的路径//2. 递推公式,因为(i, j)只能由上点(i - 1, j)或左点(i, j - 1)得到,所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1];//但需要注意的是,这道题中出现了障碍物,如果(i, j)是障碍物的话dp[i][j] = 0//3. 初始化,因为所有的点都是由最左一列和最上一行推导出来的,所以最左一列和最上一行全部赋值为1,如果有障碍物的话,从当前节点到之后全为0vector<vector<int>> dp(m, vector<int>(n, 0));//最左一列for(int i = 0; i < m; ++i){if(obstacleGrid[i][0] == 1){break;}dp[i][0] = 1;}//最上一行for(int j = 0; j < n; ++j){if(obstacleGrid[0][j] == 1){break;}dp[0][j] = 1;}//4.遍历顺序,从上往下,从左往右for(int i = 1; i < m; ++i){for(int j = 1; j < n; ++j){if(obstacleGrid[i][j]){dp[i][j] = 0;continue;}dp[i][j] = dp[i - 1][j] + dp[i][j - 1];//cout << "(" << i << ", " << j << "):" << dp[i][j] << ' ';//cout << "(" << i - 1 << ", " << j << "):" << dp[i - 1][j] << ' ';//cout << "(" << i << ", " << j - 1 << "):" << dp[i][j - 1] << endl;}}return dp[m - 1][n - 1];}
};