Follow up for "Unique Paths":
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as 1
and 0
respectively in the grid.
For example,
There is one obstacle in the middle of a 3x3 grid as illustrated below.
[ [0,0,0], [0,1,0], [0,0,0] ]
The total number of unique paths is 2
.
Note: m and n will be at most 100.
题意:给出m*n的矩阵,矩阵中由1,0组成,1表示障碍物,问从(0,0)到(m-1,n-1)的路径数,注意,只能向下和向右移动,不能走障碍物
思路:动态规划法,状态转移方程为dp(x,y)=dp(x-1,y) + dp(x, y-1),注意如果(x-1,y),(x,y-1)处为障碍物,则dp(x-1,y)=0,dp(x,y-1)=0,用记忆化搜索,否则会超时
代码如下
public class Solution {
private static final int N = 101;
private static final int[][] memo = new int[N][N];
private int dp(int m, int n, int[][] obstacleGrid)
{
if (obstacleGrid[m][n] == 1) return memo[m][n] = 0;
if (memo[m][n] != -1) return memo[m][n];
if (m == 0 && n == 0) {
if (obstacleGrid[m][n] == 1) return memo[m][n] = 0;
else return memo[m][n] = 1;
}
return memo[m][n] = (m > 0 ? dp(m - 1, n, obstacleGrid) : 0) + (n > 0 ? dp(m, n - 1, obstacleGrid) : 0);
}
public int uniquePathsWithObstacles(int[][] obstacleGrid)
{
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
for (int i = 0; i < m; i++) {
Arrays.fill(memo[i], -1);
}
return dp(m - 1, n - 1, obstacleGrid);
}
}