代码随想录训练营第三十四天 62不同路径 63不同路径II

第一题:

原题链接:62. 不同路径 - 力扣(LeetCode)

思路:

动态规划:

首先确定dp[i][j]是什么定义:表示下标为i,j的位置上有dp[i][j]条路径。

由题目可以知道dp[i][j]是什么推导来的,由于机器人智能向下或者向右移动一步,因此只能左边和上面移动而来。因此递推表达式如下:

dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

初始化:第一行和第一列初始化为1。因为第一行和第一列的位置都是只有一条路径能到达。

遍历顺序:从dp[1][1]开始遍历。

代码如下:

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

思路:

跟上一道很相似,只有细微的差别,注意两点:

1.初始化的时候遇到障碍之后剩下没有置为1的位置就不能置为1了。

2.在遍历过程中遇到障碍的位置dp[i][j]置为0;

代码如下:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size(), n = obstacleGrid[0].size();
        if(m == 0 && n == 0) return 0;
        vector<vector<int>> dp(m, vector<int>(n, 0));
        for(int i = 0; i < m; i++){
            if(obstacleGrid[i][0] == 0){
                dp[i][0] = 1;
            }else{
                break;
            }
        } 
        for(int i = 0; i < n; i++){
            if(obstacleGrid[0][i] == 0){
                dp[0][i] = 1;
            }else{
                break;
            }
        }
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                if(obstacleGrid[i][j] == 1){
                    dp[i][j] = 0;
                }else{
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }              
            }
        }
        return dp[m - 1][n - 1];
    }
};

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值