代码随想录算法训练营第三十九天 | 62.不同路径,63. 不同路径 II

依旧是动态规划哦!
62. 不同路径
一开始没有想法!

class Solution {
public:
    int uniquePaths(int m, int n) {
        //1. 确定dp数组及下标的含义
        //dp[i][j]---从(0,0)到(i,j)有dp[i][j]种方法
        vector<vector<int>> dp(m + 1, vector<int>(n+1));
        //3. 确定dp数组如何初始化
        for (int i = 0; i < m; i++){ //最左边一列
            dp[i][0] = 1;
        }
        for (int j = 0; j < n; j++){ //最上边一列
            dp[0][j] = 1;
        }
        //4. 确定遍历顺序
        for (int i = 1; i < m; i++){ //从上往下遍历
            for (int j = 1; j < n; j++){ //从左往右遍历
                //2. 递推公式
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m - 1][n - 1];
        //5. 打印dp数组
    }
};

62. 不同路径II
比上一题多了障碍,那么递推公式也应该有条件,还有注意如何初始化dp数组!!

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        //计算m和n
        int m, n;
        m = obstacleGrid.size(); 
        n = obstacleGrid[0].size();
        
        //1. 确定dp数组及下标的含义
        //dp[i][j]---从(0,0)到(i,j)有dp[i][j]种不同的路径
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));

        //3. 对dp数组初始化
        int i, j;
        for (i = 0; i < m; i++){ //初始化最左列
            if (obstacleGrid[i][0] == 0){
                dp[i][0] = 1;
            }
            else {
                break;
            }
        }
        for (j = 0; j < n; j++){
            if (obstacleGrid[0][j] == 0){ //初始化最上边一列
                dp[0][j] = 1;
            }
            else {
                break;
            }
        }

        //4. 确定遍历顺序
        for (i = 1; i < m; i++){
            for (j = 1; j < n; j++){
                //注意这个条件
                if (obstacleGrid[i][j] == 0){
                    //2. 递推公式
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }
        return dp[m - 1][n - 1];

        //5. 打印dp数组
        // cout << "hey" << endl;
        // for (i = 0; i < m; i++){
        //     for (j = 0; j < n; j++){
        //         cout << dp[i][j] << " ";
        //     }
        //     cout << endl;
        // }
    }
};

努力啊!!!

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