题目
类型:动态规划
难度:中等
解题思路
1、用f(i, j)
来表示从坐标(0,0)
到坐标(i, j)
的路径总数,u(i,j)
表示坐标(i,j)
是否可行,如果坐标(i,j)
有障碍物, u(i,j)=0
,否则 u(i, j) = 1
。
2、因为 机器人每次只能向下或者向右移动一步,所以从坐标(0,0)
到坐标(i,j)
的路径总数的值只取决于从坐标 (0,0)
到坐标(i−1,j)
的路径总数和从坐标 (0,0)
到坐标(i,j−1)
的路径总数,即 f(i,j)
只能通过f(i - 1, j)
和f(i,j−1)
转移得到。当坐标(i,j)
本身有障碍的时候,任何路径都到到不了 f(i,j)
,此时f(i, j) = 0
3、如果坐标 (i−1,j)
没有障碍,那么就意味着从坐标(i−1,j)
可以走到(i, j)
,即 (i−1,j)
位置对f(i,j)
的贡献为f(i−1,j)
,同理,当坐标(i,j−1)
没有障碍的时候,(i,j−1)
位置对 f(i,j)
的贡献为f(i,j−1)
。
综上所述,我们可以得到这样的动态规划转移方程:
代码
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int n = obstacleGrid.length, m = obstacleGrid[0].length;
int[] f = new int[m];
f[0] = obstacleGrid[0][0] == 0 ? 1 : 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (obstacleGrid[i][j] == 1) {
f[j] = 0;
continue;
}
if (j - 1 >= 0 && obstacleGrid[i][j - 1] == 0) {
f[j] += f[j - 1];
}
}
}
return f[m - 1];
}
}