leetcode 63. 不同路径 II
代码
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(),n = obstacleGrid[0].size();
vector<vector<int>> dp(m,vector<int>(n));
for(int i = 0;i < m && obstacleGrid[i][0] == 0;++i) dp[i][0] = 1;
for(int i = 0;i < n && obstacleGrid[0][i] == 0;++i) dp[0][i] = 1;
for(int i = 1;i < m;++i){
for(int j = 1;j < n;++j){
if(obstacleGrid[i][j] == 1){
dp[i][j] = 0;continue;
}
if(dp[i-1][j] > 0) dp[i][j] += dp[i-1][j];
if(dp[i][j-1] > 0) dp[i][j] += dp[i][j-1];
}
}
return dp[m-1][n-1];
}
};
灵神题解:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
vector memo(m, vector<int>(n, -1)); // -1 表示没有计算过
auto dfs = [&](this auto&& dfs, int i, int j) -> int {
if (i < 0 || j < 0 || obstacleGrid[i][j]) {
return 0;
}
if (i == 0 && j == 0) {
return 1;
}
int& res = memo[i][j]; // 注意这里是引用
if (res != -1) { // 之前计算过
return res;
}
return res = dfs(i - 1, j) + dfs(i, j - 1);
};
return dfs(m - 1, n - 1);
}
};