该题先确认dp,这里的dp数组是方法的数量。每走一步都是前面的向下走的方法和向右走的和。
class Solution {
public int uniquePaths(int m, int n) {
int [][] dp=new int [m][n];
for(int i=0;i<m;i++)
{
dp[i][0]=1;
}
for(int j=0;j<n;j++)
{
dp[0][j]=1;
}
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
dp[i][j]=dp[i][j-1]+dp[i-1][j];
}
}
return dp[m-1][n-1];
}
}
该题与上一题不一样的是出现了障碍物,但是初始化还是一样的,只是遇到障碍物就进行continue
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m=obstacleGrid.length;
int n=obstacleGrid[0].length;
int [][] dp=new int [m][n];
if(obstacleGrid[m-1][n-1]==1||obstacleGrid[0][0]==1)
{
return 0;
}
for(int i=0;i<m&&obstacleGrid[i][0]==0;i++)
{
dp[i][0]=1;
}
for(int j=0;j<n&&obstacleGrid[0][j]==0;j++)
{
dp[0][j]=1;
}
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
if(obstacleGrid[i][j]==1)
{
continue;
}
dp[i][j]=dp[i][j-1]+dp[i-1][j];
}
}
return dp[m-1][n-1];
}
}
总结:初始化有点难想。