【Day39】代码随想录之动态规划part2——不同路径、不同路径II

今天是动态规划的第2部分,开冲!!!

今日任务:

  • 62.不同路径
  • 63.不同路径II

今天开始逐渐有 dp的感觉了,题目不多,就两个 不同路径,可以好好研究一下

题目一:62.不同路径

Leetcode题目:【62.不同路径】
参考:【代码随想录之不同路径】

在这里插入图片描述
按照动态规划五部曲来看:
(1)dp数组及其下标的含义:dp[i][j]表示从[0,0]走到[i,j]有多少种不同的路径;
(2)递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1];
(3)初始化dp数组:最上方都为1,最左边都为1;
(4)遍历的顺序:从左到右,从上到下(因为初始值就是在左边和上边);
(5)打印dp数组(仅当结果出错的时候)

注意点:生成固定长度的二维数组应该怎么写,见下面的代码:

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n));
        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]; 
    }
};

题目二:63.不同路径II

Leetcode题目:【63.不同路径II】
参考:【代码随想录之不同路径II】

在这里插入图片描述

此题与上一个题目的区别在于多了一个障碍物,然后在递推方程和初始化的时候进行了变动:
按照动态规划五部曲来看:
(1)dp数组及其下标的含义:dp[i][j]表示从[0,0]走到[i,j]有多少种不同的路径;
(2)递推公式:在不是障碍物的时候,进行下面操作:dp[i][j] = dp[i-1][j] + dp[i][j-1];
(3)初始化dp数组:没遇到障碍物则最上方都为1,其余为0;没遇到障碍物最左边都为1,其余为0;
(4)遍历的顺序:从左到右,从上到下(因为初始值就是在左边和上边);
(5)打印dp数组(仅当结果出错的时候)

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));
        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] == 0){
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
        } 
        return dp[m -1][n -1];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值