- 结果
- 思路
使用动态规划求解的思路比较简单,dp[i][j]表示从obstacleGrid[0][0]开始到obstacleGrid[i][j]有多少条不同的路径。代码中前面两个while是给dp数组赋初始值。状态转移方程如下:
obstacleGrid[i][j] = 1时,dp[i][j] = 1;
obstacleGrid[i][j] = 0时,dp[i][j] = dp[i - 1][j] + dp[i][j - 1];(需要注意边界问题,下面代码,i,j是从2开始遍历的)
- 代码
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
if(m + n == 0)
return 0;
unsigned int dp[m][n];
memset(dp, 0, m * n * 4);
int i = 0,j = 0;
while(i < n && obstacleGrid[0][i] == 0){
dp[0][i] = 1;
i++;
}
while(j < m && obstacleGrid[j][0] == 0){
dp[j][0] = 1;
j++;
}
for(j = 1; j < m; j++){
for(i = 1; i < n; i++){
if(obstacleGrid[j][i] == 1)
dp[j][i] = 0;
else
dp[j][i] = dp[j -1][i] + dp[j][i - 1];
}
}
return dp[m-1][n-1];
}
};