算法记录
LeetCode 题目:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
说明
一、题目
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
二、分析
- 机器人只能往右或者下方移动,也就意味着当前点的来处只能是上一个位置或者是左一个位置,状态转移方程就可以定义出来了。
- 边界条件是第一行和第一列,这两处位置只能单方向的前进,也就是一旦有一个位置被障碍物堵了后面的位置都不可到达,这是一个初始化需要进行的。
- 因为原数据上存在着障碍物的代码为正数,为了确保最终移动的正确,就不能在原位上进行操作,只能新建一个状态数组。
- 遍历这个路径数组,预到障碍物直接跳过即可,因为当前点的路径肯定为零,就不用检测了。
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int[][] stat = new int[obstacleGrid.length][obstacleGrid[0].length];
if(obstacleGrid[0][0] != 1) stat[0][0] = 1;
for(int i = 1; i < obstacleGrid.length; i++) {
if(obstacleGrid[i][0] != 1 && stat[i - 1][0] != 0) stat[i][0] = 1;
}
for(int i = 1; i < obstacleGrid[0].length; i++) {
if(obstacleGrid[0][i] != 1 && stat[0][i - 1] != 0) stat[0][i] = 1;
}
for(int i = 1; i < obstacleGrid.length; i++) {
for(int j = 1; j < obstacleGrid[0].length; j++) {
if(obstacleGrid[i][j] == 1) continue;
if(stat[i - 1][j] != 0 || stat[i][j - 1] != 0) {
stat[i][j] = stat[i - 1][j] + stat[i][j - 1];
}
}
}
return stat[stat.length - 1][stat[0].length - 1];
}
}
总结
数字动态规划应用场景和状态转移方程的定义。