数据结构与算法--动态规划2(不同路径问题)

代码随想录day39 动态规划模块不同路径问题

1.leetcode 62.不同路径

力扣题目链接
在这里插入图片描述

1.1思路

  这题比较明显的使用dp二维数组,dp[i][j]对应的就是起始位置走到i,j位置的总路径,因此,可以把示例一用dp数组的形式描述出来。
在这里插入图片描述
根据这图就很容易能得出递推公式了就,dp[i][j]=dp[i-1][j]+dp[i][j-1]

1.2做题步骤及详细代码

思路:直接根据动态规划做题步骤来:

   1.确定dp数组以及下标的含义

dp[i][j]对应的就是起始位置走到i,j位置的总路径

   2. 确定递推公式

这题递推公式已经给出来了dp[i][j]=dp[i-1][j]+dp[i][j-1]

  3. dp数组的初始化问题

根据上面的图,可知道当i=0时候,所有的dp[0][j]都是1,j=0时候,所有的dp[i][0]=1,这些都进行初始化
  4.确定遍历顺序

这题很明显的从前往后面遍历

  5. 举例推导dp公式

就是上面的那张图片

详细的代码

class Solution {
    public int uniquePaths(int m, int n) {
      int[][] dp=new int[m][n];
      dp[0][0]=0;
      for(int i=0;i<n;i++){
          dp[0][i]=1;
      }
      for(int j=0;j<m;j++){
          dp[j][0]=1;
      }
      for(int a=1;a<m;a++){
          for(int b=1;b<n;b++){
              dp[a][b]=dp[a-1][b]+dp[a][b-1];
          }
      }
      return dp[m-1][n-1];
    }
}

2.leetcode 63.不同路径Ⅱ

力扣题目链接
在这里插入图片描述
在这里插入图片描述

2.1思路

这题跟上题思路基本一致,就是将障碍的位置的值改成0就ok,因为障碍地方的值先影响其左边位置的值,会导致障碍地方左边位置的值等于障碍地方右边的值,然后还影响障碍下方的值,障碍下方的值会等于这个值的左边位置的值,这就是相当于将障碍位置的值直接修改为0。

2.2做题步骤及详细代码

思路:直接根据动态规划做题步骤来:

   1.确定dp数组以及下标的含义

dp[i][j]对应的就是起始位置走到i,j位置的总路径

   2. 确定递推公式

这题递推公式已经给出来了dp[i][j]=dp[i-1][j]+dp[i][j-1]

  3. dp数组的初始化问题

根据上面的图,可知道当i=0时候,所有的dp[0][j]都是1,j=0时候,所有的dp[i][0]=1,这些都进行初始化
  4.确定遍历顺序

这题很明显的从前往后面遍历

  5. 举例推导dp公式

就是上面的那张图片

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
      int m=obstacleGrid.length;
      int n=obstacleGrid[0].length;
      int [][] dp=new int[m][n];
      //当障碍位置在开始位置和结束位置就直接返回0
      if(obstacleGrid[0][0]==1||obstacleGrid[m-1][n-1]==1){
          return 0;
      }
        for(int i=0;i<n&& obstacleGrid[0][i]==0;i++){
          dp[0][i]=1;
      }
      for(int j=0;j<m&& obstacleGrid[j][0]==0;j++){
          dp[j][0]=1;
      }
      for(int i=1;i<m;i++){
          for(int j=1;j<n;j++){
              if(obstacleGrid[i][j]==1){
                  dp[i][j]=0;
              }else if(obstacleGrid[i][j]==0){
                 dp[i][j]=dp[i-1][j]+dp[i][j-1];
              }

          }
      }
      return dp[m-1][n-1];
    }
}
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值