代码随想录算法训练营第43天DP动态规划62不同路径63 不同路径2

LeetCode 62不同路径

题目讲解

在这里插入图片描述

思路

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

根据题意来看机器人只能进行向右和向下的移动 ,然后求有多少路径
这里的递推公式 是

想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。

此时在回顾一下 dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理。

那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。

所以这道题递推公式为 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

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

LeetCode 63 不同路径ii

题目讲解

在这里插入图片描述

思路

是上一道题的升级版 有了障碍这一新的二维数组在这道题里是obastacleGrid
在递推公式 上与上一题不同需要考虑到 如果遇到障碍的情况但是大体是不变的

递推公式和62.不同路径一样,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。

但这里需要注意一点,因为有了障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)。

if (obstacleGrid[i][j] == 0) { // 当(i, j)没有障碍的时候,再推导dp[i][j]
    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}

然后就是进行初始化

 for(int i=0;i<m&& obstacleGrid[i][0]==0;i++)
        {
            dp[i][0]=1;
        }
        for( int j=0;j<n&& obstacleGrid[0][j]==0;j++)
        {
            dp[0][j]=1;
        }

与上道题不同,遇到障碍

但如果(i, 0) 这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的dp[i][0]应该还是初始值0。

最后从正面进行遍历,然后在记得打印

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m =obstacleGrid.length;
        int n= obstacleGrid[0].length;
        int [][]dp= new int[m][n];
        if( (obstacleGrid[m-1][n-1]==1)||(obstacleGrid[0][0]==1 )) return 0;
        for(int i=0;i<m&& obstacleGrid[i][0]==0;i++)
        {
            dp[i][0]=1;
        }
        for( int j=0;j<n&& obstacleGrid[0][j]==0;j++)
        {
            dp[0][j]=1;
        }
        for( int i=1;i<m;i++)
        {
            for( int j=1;j<n;j++)
            {
                dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;
            }
        }
        return dp[m-1][n-1];
    }
}

小结

马上开学了,终于冲出了房间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值