动态规划轻松解决:grid[i][j]为到达(i,j)处的方案数,则:grid[i][j]=grid[i-1][j]+grid[i][j-1].。
public class Solution {
public int uniquePaths(int m, int n) {
int[][] grid = new int[m][n];
for(int i = 0; i<m; i++){
for(int j = 0; j<n; j++){
if(i==0||j==0)
grid[i][j] = 1;
else
grid[i][j] = grid[i][j-1] + grid[i-1][j];
}
}
return grid[m-1][n-1];
}
}
如果(i,j)处有障碍则该点不可达,path[i][j]=0,否则,path[i][j]=path[i-1][j]+path[i][j-1]。另外,边界注意一下就好。
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int n = obstacleGrid.length;
int m = obstacleGrid[0].length;
int[][] path = new int[n][m];
for (int i = 0; i < n; i++) {
if (obstacleGrid[i][0] == 1) {
while (i < n) {
path[i][0] = 0;
i++;
}
} else {
path[i][0] = 1;
}
}
for (int j = 0; j < m; j++) {
if (obstacleGrid[0][j] == 1) {
while (j < m) {
path[0][j] = 0;
j++;
}
} else {
path[0][j] = 1;
}
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
if (obstacleGrid[i][j] == 0) {
path[i][j] = path[i - 1][j] + path[i][j - 1];
} else path[i][j] = 0;
}
}
return path[n - 1][m - 1];
}
}