代码随想录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];
}
}