动态规划法
逆过程从终点开始看有几种走法,finish可能是往下走 或者往右走得到的,因此finish一格有两种走法....一直这样退回去
public int uniquePaths(int m, int n) {
if(m==0||n==0) return 0;
int[][]dp = new int[m][n];
dp[0][0]=1;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
//如果是边沿初始化为1
if(i==0||j==0) dp[i][j]=1;
else{
//上方左方的和
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int n=obstacleGrid.length;
int m=obstacleGrid[0].length;
int[][] dp = new int[n][m];
if(obstacleGrid[0][0]==1||obstacleGrid[n-1][m-1]==1)
return 0;
dp[0][0]=1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(obstacleGrid[i][j]==1)
continue;
if(i>0)dp[i][j]+=dp[i-1][j];
if(j>0)dp[i][j]+=dp[i][j-1];
}
}
return dp[n-1][m-1];
}