不同路径
题目链接:https://leetcode.cn/problems/unique-paths/
class Solution {
public int uniquePaths(int m, int n) {
//dp[i][j] 是到格子[i][j]的路径个数
//dp[i][j] = dp[i-1][j]+dp[i][j-1];
// 第一行,第一列初始化为1
// 从第二行,第二列开始推导,左到右,上到下
// 示例二
int[][] dp =new int[m][n];
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];
}
}
不同路径2
题目链接:https://leetcode.cn/problems/unique-paths-ii/submissions/622383429/
本题相较于上题,主要的区别在于初始化的方式不对,对于第一行,第一列,要用到一个标记符号c,r来代表这条路有没有障碍,有障碍的话,后面的路均不好走。
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
//dp[i][j] 是到格子[i][j]的路径个数
//dp[i][j] = dp[i-1][j]+dp[i][j-1];
// 第一行,第一列初始化为1
// 从第二行,第二列开始推导,左到右,上到下
// 示例二
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp =new int[m][n];
//初始化的方法要变一下
boolean c=false,r=false;
for(int i=0;i<n;i++)
if(r == false)
{
if(obstacleGrid[0][i]==1)
{
dp[0][i] = 0;
r = true;
}
else dp[0][i] = 1;
}else dp[0][i] = 0;
for(int i=0;i<m;i++)
if(c == false)
{
if(obstacleGrid[i][0]==1)
{
dp[i][0] = 0;
c = true;
}
else dp[i][0] = 1;
}else dp[i][0] = 0;
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(obstacleGrid[i][j]!=1)
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}