一、题目描述
二、解题思路
进阶版的不同路径,dp
来解答,很明显是二维动态规划
- 定义
dp
含义:定义 d p [ i ] [ j ] dp[i][j] dp[i][j]为走到坐标为 ( i , j ) (i, j) (i,j)这一点的走法 - 定义边界条件
- 首行首列上没有障碍物的情况下,首行首列肯定都是1的了,因为只能有一种走法
- 但是,如果首行首列上有障碍物,那么最远只能走到障碍物的前面,包括障碍物所在的那一点及其后面的
dp
的值都是0
- 建立状态转移方程
- 假设当前机器人位于 ( i , j ) (i, j) (i,j),默认
dp[i][j] = 0;
- 如果该点有障碍物,那么
dp[i][j]
只能为0 - 如果该点没有障碍物
- 上面的点
- 有障碍物,那么上面的路被堵死,只能从左边过来,那么
dp[i][j]
不变,加上0 - 没有障碍物,可以从上面过来,那么
dp[i][j] += dp[i - 1][j]
- 整理:
dp[i][j] += (obstacleGrid[i][j - 1] ? 0 : dp[i][j - 1]);
- 有障碍物,那么上面的路被堵死,只能从左边过来,那么
- 左边的点
- 同理:
dp[i][j] += (obstacleGrid[i - 1][j] ? 0 : dp[i - 1][j]);
- 同理:
- 上面的点
- 如果该点有障碍物,那么
- 假设当前机器人位于 ( i , j ) (i, j) (i,j),默认
三、解题代码
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
auto m = obstacleGrid.size();
auto n = obstacleGrid[0].size();
unsigned int dp[m][n];
bool flag = 0;
for(int i = 0; i < m; i++){
if(!obstacleGrid[i][0] && !flag)
dp[i][0] = 1;
else{
dp[i][0] = 0;
flag = 1;
}
}
flag = 0;
for(int i = 0; i < n; i++){
if(!obstacleGrid[0][i] && !flag)
dp[0][i] = 1;
else{
dp[0][i] = 0;
flag = 1;
}
}
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
dp[i][j] = 0;
if(obstacleGrid[i][j] == 0){
if(obstacleGrid[i][j - 1] == 0)
dp[i][j] += (obstacleGrid[i][j - 1] ? 0 : dp[i][j - 1]);
if(obstacleGrid[i - 1][j] == 0)
dp[i][j] += (obstacleGrid[i - 1][j] ? 0 : dp[i - 1][j]);
}
}
}
return dp[m - 1][n - 1];
}
};
四、运行结果
有一组运行结果很是嚣张:
[[0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,1],[0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0],[0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0],[1,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0],[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0],[0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0],[0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0],[1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,1],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0],[0,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0],[0,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,1],[1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0],[0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,1],[0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1],[1,1,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1],[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0]]
直接导致我数据溢出,这个故事告诉我们要把dp
数组设置成unsigned int
型,避免溢出