题目描述:
标签:数组 动态规划
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
代码:
思路分析:动态规划五部曲
1、确定dp数组以及下标的含义——这里dp[i][j]是指第(i,j)格有多少条路径
2、确定递推公式,当你站在第(i,j)格,因为可以往下或者往右到该格,所以dp[i][j] = dp[i-1][j] + dp[i][j-1],不过要注意的是如果该格为障碍物,则dp[i][j]=0,即保持初始状态不变(初始化值就是0,不用处理,保持原样即可)
3、dp数组初始化,dp[i][0]=1,dp[0][j]=1,即第0行和第0列都是1,只有一种方法达到,但要注意的就是如果第0行或第0列出现障碍物,则后面的格子都是0,即保持初始值0,所以遇到障碍物就break跳出循环即可
4、确定遍历顺序,双层for循环,从(1,1)开始
5、举例推导dp数组
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
for(int i = 0;i < m;i++){
if(obstacleGrid[i][0] == 1){
break;
}
dp[i][0] = 1;
}
for(int j = 0;j < n;j++){
if(obstacleGrid[0][j] == 1){
break;
}
dp[0][j] = 1;
}
for(int i = 1;i < m;i++){
for(int j = 1;j < n;j++){
if(obstacleGrid[i][j] == 0){
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}