115不同的路径II
2018-01-05 16:44
330 查看
"不同的路径" 的跟进问题:
现在考虑网格中有障碍物,那样将会有多少条不同的路径?
网格中的障碍和空位置分别用 1 和 0 来表示。
//对问题说明:
它没有说完,只能向下或者向左的移动,不然答案不会是这个。
我的思路:
根据110习题学习,我在这道题上采用动态规划的方式,从小到大的构造。
状态转化:f(m,n) = f(m-1,n) + f(m,n-1);//其中如果f(m,n)是障碍则不更新,f(m-1,n)为障碍则忽略。
初值:最上一行与最左一列MAP初值为1,如果是障碍则跳出赋值,不再继续对同行或列赋值。
最后返回f(m,n)
int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid) {
// write your code here
vector<vector<int> >map( obstacleGrid.size(),vector<int>(obstacleGrid[0].size()));
int l = obstacleGrid.size();
int w = obstacleGrid[0].size();
if(l == 1){
for(int i = 0 ; i < w ; i ++){
if(obstacleGrid[0][i] == 1)
return 0;
}
return 1;
}
else if(w == 1){
for(int i = 0 ; i < l ; i ++){
if(obstacleGrid[i][0] == 1)
return 0;
}
return 1;
}
for(int i = 0 ; i < l ; i ++){
if(obstacleGrid[i][0] == 1)
break;
map[i][0] = 1;
}
for(int i = 0 ; i < w ; i ++){
if(obstacleGrid[0][i] == 1)
break;
map[0][i] = 1;
}
for(int i = 1 ; i < l ; i ++){
for(int j = 1 ; j < w ; j ++){
if(obstacleGrid[i][j] == 1)
continue;
if(obstacleGrid[i-1][j] == 1 && obstacleGrid[i][j-1] == 1){
continue;
}
else if(obstacleGrid[i-1][j] == 1)
map[i][j] = map[i][j-1];
else if(obstacleGrid[i][j-1] == 1)
map[i][j] = map[i-1][j];
else
map[i][j] = map[i-1][j] + map[i][j-1];
}
}
return map[l-1][w-1];
}
答案:
与我的区别不大。
现在考虑网格中有障碍物,那样将会有多少条不同的路径?
网格中的障碍和空位置分别用 1 和 0 来表示。
//对问题说明:
它没有说完,只能向下或者向左的移动,不然答案不会是这个。
我的思路:
根据110习题学习,我在这道题上采用动态规划的方式,从小到大的构造。
状态转化:f(m,n) = f(m-1,n) + f(m,n-1);//其中如果f(m,n)是障碍则不更新,f(m-1,n)为障碍则忽略。
初值:最上一行与最左一列MAP初值为1,如果是障碍则跳出赋值,不再继续对同行或列赋值。
最后返回f(m,n)
int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid) {
// write your code here
vector<vector<int> >map( obstacleGrid.size(),vector<int>(obstacleGrid[0].size()));
int l = obstacleGrid.size();
int w = obstacleGrid[0].size();
if(l == 1){
for(int i = 0 ; i < w ; i ++){
if(obstacleGrid[0][i] == 1)
return 0;
}
return 1;
}
else if(w == 1){
for(int i = 0 ; i < l ; i ++){
if(obstacleGrid[i][0] == 1)
return 0;
}
return 1;
}
for(int i = 0 ; i < l ; i ++){
if(obstacleGrid[i][0] == 1)
break;
map[i][0] = 1;
}
for(int i = 0 ; i < w ; i ++){
if(obstacleGrid[0][i] == 1)
break;
map[0][i] = 1;
}
for(int i = 1 ; i < l ; i ++){
for(int j = 1 ; j < w ; j ++){
if(obstacleGrid[i][j] == 1)
continue;
if(obstacleGrid[i-1][j] == 1 && obstacleGrid[i][j-1] == 1){
continue;
}
else if(obstacleGrid[i-1][j] == 1)
map[i][j] = map[i][j-1];
else if(obstacleGrid[i][j-1] == 1)
map[i][j] = map[i-1][j];
else
map[i][j] = map[i-1][j] + map[i][j-1];
}
}
return map[l-1][w-1];
}
答案:
与我的区别不大。
相关文章推荐
- lintcode-不同的路径II-115
- 115 - 不同的路径 II
- lintcode-115-不同的路径 II
- python_lintcode_115不同的路径 II_112删除排序链表中的重复元素
- 不同的路径II
- 不同的路径 II
- 不同的路径 II
- LintCode 不同的路径 II
- LeetCode OJ 之 Unique Paths II(不同路径 - 二)
- 不同的路径II
- LintCode 不同的路径II
- lintcode unique-paths-ii 不同的路径ii
- LintCode刷题——不同的路径 II
- LeetCode题库解答与分析——#63.不同路径IIUniquePathsII
- LintCode:不同的路径II
- lintcode(115)不同的路径2
- 不同的路径 II
- 不同的路径 II
- LintCode -- 不同的路径 II
- 不同的路径 II