动态规划
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
if (obstacleGrid.size() ==0 || obstacleGrid[0][0] == 1) return 0;
int row = obstacleGrid.size();
int col = obstacleGrid[0].size();
vector<vector<int>> dp(row, vector<int>(col, 0));
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (obstacleGrid[i][j] == 1) {
dp[i][j] = 0;
continue;
}
if (i == 0 && j == 0) dp[i][j] = 1;
else if (i == 0) dp[i][j] = dp[i][j-1]; //注意初始化边界的时候,一定不能直接写成1,因为边界上可能存在障碍物!!!
else if (j == 0) dp[i][j] = dp[i-1][j];
else dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[row-1][col-1];
}
};
-- 优化:将dp数组多初始化一行一列。这样可以不用初始化dp首行和首列,直接调用dp方程即可;
此时要注意obstacleGrid 中的i,j判断是要减1,因为比dp数组少一行一列
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int row = obstacleGrid.size();
int col = obstacleGrid[0].size();
vector<vector<int>> dp(row + 1, vector<int>(col + 1, 0));
dp[0][1] = 1; //dp[1][0] 也可以
for (int i = 1; i <= row; ++i) {
for (int j = 1; j <= col; ++j) {
if (obstacleGrid[i-1][j-1] == 0)
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[row][col];
}
};