(i)
【题目描述】A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).
How many possible unique paths are there?
Above is a 3 x 7 grid. How many possible unique paths are there?
Note: m and n will be at most 100.
【解题思路】动态规划 分为子问题: 每一个点的可到达路径数=左边一个点的可到达路径数+上边一个点的可到达路径数
【考查内容】数组,动态规划
class Solution {
public:
int uniquePaths(int m, int n) {
if(m < n)return uniquePaths(n,m);
vector<int>dp(n,1);
for(int j = 1 ; j < m; j++)
for(int i = 1; i < n; i++){
dp[i] = dp[i] + dp[i-1];
}
return dp[n-1];
}
};
(ii)
【题目描述】Follow up for “Unique Paths”:
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as1and0respectively in the grid.
For example,
There is one obstacle in the middle of a 3x3 grid as illustrated below.
[
[0,0,0],
[0,1,0],
[0,0,0]
]
The total number of unique paths is 2.
Note: m and n will be at most 100.
给定一个二维数组,元素若为1则代表此处不通。求从起点到终点有几条路可走。
【解题思路】思路与题目Unique Paths类似,不同之处为:
初始化边界上行和列时,出现障碍,后面路径数dp的都是0
中间的格子出现障碍时,该格子dp表示的路径数直接填0
【考查内容】数组,动态规划
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector<vector<int>> map(m, vector<int>(n, 0));//如果直接用 int map[m][n] 部分测试样例过不了。。。
if(obstacleGrid[0][0] == 1)return 0;//如果一开始就有障碍,肯定就没路
for(int i = 0; i<m;i++){
if(obstacleGrid[i][0]){
map[i][0] = 0;
break;//如果这一行有一个障碍,剩下的路都走不通,都为0
}
else map[i][0] = 1;
}
for(int j = 0; j<n;j++){
if(obstacleGrid[0][j]){
map[0][j] = 0;
break;
}
else map[0][j] = 1;
}
for(int i = 1; i<m; i++){
for(int j = 1; j<n; j++){
if(obstacleGrid[i][j] == 1){
map[i][j] = 0;
}
else map[i][j] = map[i-1][j]+map[i][j-1];
}
}
return map[m-1][n-1];
}
};