39代码随想录训练营day39|动态规划part02

1、不同路径

不同路径

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m, vector<int>(n, 0));
        for (int i = 0; i < m; i++) dp[i][0] = 1;
        for (int i = 0; i < n; 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];
    }
};

2、不同路径Ⅱ

不同路径Ⅱ

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        vector<vector<int>> dp(obstacleGrid);
        // 如果起点和终点有障碍物,则返回0
        if (dp.front().front() == 1) return 0;
        if (dp.back().back() == 1) return 0;
        // 初始化第一行 !!! 注意,起点被初始化为1,表示只有一条路!!
        for (int i = 0; i < dp[0].size(); i++) {
            if (dp[0][i] != 1) dp[0][i] = 1;
            else {
                for (; i < dp[0].size(); i++) {
                    dp[0][i] = 0;
                }
            }
        }
        // 初始化第一列 !!! 注意,跳过第一个元素,因为被初始化为1
        for (int i = 1; i < dp.size(); i++) {
            if (dp[i][0] != 1) dp[i][0] = 1;
            else {
                for (; i < dp.size(); i++) {
                    dp[i][0] = 0;
                }
            }
        }
        for (int i = 1; i < dp.size(); i++) {
            for (int j = 1; j < dp[0].size(); j++) {
            	// 将障碍物改为0,表示有障碍物的有0条路径
                if (dp[i][j] == 1) dp[i][j] = 0;
                else dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[dp.size() - 1][dp[0].size() - 1];
    }
};

你可能感兴趣的:(代码随想录训练营,动态规划,算法,leetcode,c++)