不同路径
力扣连接:62. 不同路径(中等)
动态规划的方法
推导公式:F[m][n] = F[上一行][n] + F[m][上一列];
图解步骤
代码
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
dp[0][0] = 1;
//先把第一行填充完,即 i=0 的情况
for(int j=1;j<n;j++){
dp[0][j] = 1;
}
//先把第一列填充完,即 j=0 的情况
for(int i=1;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];
}
}
不同路径 II
力扣连接:63. 不同路径 II(中等)
图解步骤
初始化:
遍历中:
代码
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
dp[0][0] = 1;
if(obstacleGrid[0][0]==1) return 0;
//先把第一行填充完,即 i=0 的情况
for(int j=1; j<n; j++){
if(obstacleGrid[0][j]==1 || dp[0][j-1]==0){
dp[0][j] = 0;
}else{
dp[0][j] = 1;
}
}
//先把第一列填充完,即 j=0 的情况
for(int i=1; i<m; i++){
if(obstacleGrid[i][0]==1 || dp[i-1][0]==0){
dp[i][0] = 0;
}else{
dp[i][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{
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}