代码随想录算法训练营第39天 | 动态规划 LeetCode62.不同路径,63. 不同路径 II

@代码随想录算法训练营第39天 | 动态规划 LeetCode62.不同路径,63. 不同路径 II

62.不同路径

第一遍读题思考

搞错题号了,所以上来先做了63题,然后直接把代码搬过来就行了,很简单。

代码随想录解法思路

给了好几种不同的解法,这道题动规不是最优解,数论解法比较好,但是求Cmn的时候容易溢出。

c++代码具体实现注意事项

(动态规划版本)
class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m, vector<int>(n, 0));
        for(int i=0;i<dp.size();i++){
            dp[i][0] = 1;
        }
        for(int i=0;i<dp[0].size();i++){
            dp[0][i] = 1;
        }
        for(int i=1;i<m;i++)
            for(int j=1;j<n;j++){
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        return dp[m-1][n-1];
    }
};
(数论,排列组合公式)
class Solution {
public:
    int uniquePaths(int m, int n) {
        long long numerator = 1; // 分子
        int denominator = m - 1; // 分母
        int count = m - 1;
        int t = m + n - 2;
        while (count--) {
            numerator *= (t--);
            while (denominator != 0 && numerator % denominator == 0) {
                numerator /= denominator;
                denominator--;
            }
        }
        return numerator;
    }
};

63. 不同路径 II

第一遍读题思考

需要二维数组,更新状态就是上面dp加上左面dp的数值,dp在每个位置就表示多少条路径。需要注意的就是初始化,应该在最上和最左两条边初始化1,当遇到障碍物就停止初始化,后面的全为零

代码随想录解法思路

差不多

c++代码具体实现注意事项

class Solution {
public:
    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<dp.size();i++){
            if(obstacleGrid[i][0]!=1) dp[i][0] = 1;
            else break;
        }
        for(int i=0;i<dp[0].size();i++){
            if(obstacleGrid[0][i]!=1) dp[0][i] = 1;
            else break;
        }
        for(int i=1;i<obstacleGrid.size();i++)
            for(int j=1;j<obstacleGrid[0].size();j++){
                if(obstacleGrid[i][j]==1){
                    dp[i][j] = 0;
                    continue;
                } 
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        return dp[obstacleGrid.size()-1][obstacleGrid[0].size()-1];
    }
};

你可能感兴趣的:(算法,动态规划,leetcode)