题目简介:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1
和 0
来表示。
说明:m 和 n 的值均不超过 100。
示例 1:
1 2 3 4 5 6 7 8 9 10 11 12
| 输入: [ [0,0,0], [0,1,0], [0,0,0] ] 输出: 2 解释: 3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有 2 条不同的路径: 1. 向右 -> 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右
|
思路:
利用动态规划的思想,dp[i][j]
代表从起始点到第i
行,第j
列元素的路线数量。
首先初始化dp[0...i][0]
和dp[0][0...j]
,若遇到障碍,则后面的值均为0(走不过去了)。
然后开始循环遍历,若obstacleGrid[i][j] == 0
,则dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
(左边的加上边的路线,因为每次只能向右或向下移动一格)。
最后返回dp[obstacleGrid.size() - 1][obstacleGrid[0].size() - 1]
即可。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
vector<vector<int>> dp(obstacleGrid.size(), vector<int>(obstacleGrid[0].size(), 0));
if(obstacleGrid[0][0] == 1) return 0;
for(int i = 0; i < obstacleGrid.size(); i++){
if(obstacleGrid[i][0] == 0) dp[i][0] = 1; else break; }
for(int j = 1; j < obstacleGrid[0].size(); j++){
if(obstacleGrid[0][j] == 0) dp[0][j] = 1; else break; }
for(int i = 1; i < obstacleGrid.size(); i++){
for(int j = 1; j < obstacleGrid[i].size(); j++){
if(obstacleGrid[i][j] == 0) dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } }
return dp[obstacleGrid.size() - 1][obstacleGrid[0].size() - 1];
} };
|