LC 62 不同的路径
dp数组以及下标的含义
dp[i][j]:从起点到第i行第j列的方案数为dp[i][j]
递推公式
这么想,当前状态可以由哪些状态得到?由于它只能向下或向右走,所以就只能向下走到第i行第j列或向右走到第i行第j列
所以dp[i][j]=dp[i-1][j]+dp[i][j-1]
dp数组如何初始化
当i等于1的时候,dp[0][1]和dp[1][0]的值是多少?从起点到dp[0][1]的方案就只有一种,就是向右走,其实dp[0][i]的值都是1,因为就只有一种方案就是一直向右走,那么对于dp[1][0]呢?也只有一种方案1,dp[1][i]都是1
遍历顺序
由于dp[i][j]=dp[i-1][j]+dp[i][j-1]
,所以应该从上到下,从左到右
打印dp数组
代码
class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
Arrays.fill(dp[0],1);
int i=0,j=0;
for(i=0;i<m;i++)
dp[i][0]=1;
for(i=0;i<n;i++)
dp[0][i]=1;
for(i=1;i<m;i++){
for(j=1;j<n;j++)
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
return dp[m-1][n-1];
}
}
扩展
也就是LC 63,多一个障碍物的东西
思路
这个看代码可能更好理解点
代码
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m=obstacleGrid.length,n=obstacleGrid[0].length;
int[][] dp = new int[m][n];
int i=0,j=0;
// 若第一行有障碍物,则后面的全部都是0,因为只能向下和右走
for(j=0;j<n&&obstacleGrid[0][j]==0;j++)
dp[0][j]=1;
// 若第一列有障碍物,则后面的全部都是0,因为只能向下和右走
for(i=0;i<m&&obstacleGrid[i][0]==0;i++)
dp[i][0]=1;
for(i=1;i<m;i++){
for(j=1;j<n;j++)
if(obstacleGrid[i][j]==0) //障碍物用1表示
dp[i][j]=dp[i][j-1]+dp[i-1][j];
}
return dp[m-1][n-1];
}
}