uacs2024

导航

leetcode 63. 不同路径 II

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);
    }
};

 

posted on 2025-03-12 19:12  ᶜʸᵃⁿ  阅读(8)  评论(0)    收藏  举报