那么上述问题,假设这个矩阵堵塞障碍,不能在若干组合前面所用的方法,因为这么多的位置实际上是没有办法的事儿。
还有剩下的唯一合理的解决方案dp该。与最低要求,并且等,从右下角以前突起,对于位置(i, j),它的动作应该是(i+1, j)和(i, j+1)走法的和。对于边界条件还是有一些特殊,最后一行。从右往左,假设是0的话没有问题。等于右側走法的个数。一旦遇到一个1。那么它以及它左边的走法都必须置成0,你可没有穿墙术。
我认为题目明白说明了行列的个数,就是在暗示我们能够使用dp的方法,行列个数不大,空间直接开了也能够,也能够仅仅保存下一行和右一列的。
class Solution {
public:
int row, col;
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
row = obstacleGrid.size();
if(row == 0) return 0;
col = obstacleGrid[0].size();
int p[105][105];
p[row-1][col-1] = obstacleGrid[row-1][col-1] == 0? 1:0;
int i, j;
for(j=col-2;j>=0;--j){
if(obstacleGrid[row-1][j] == 0)
p[row-1][j] = p[row-1][j+1];
else
break;
}
for(i=j;i>=0;--i)
p[row-1][i] = 0;
for(j=row-2;j>=0;--j){
if(obstacleGrid[j][col-1] == 0)
p[j][col-1] = p[j+1][col-1];
else
break;
}
for(i=j;i>=0;--i)
p[i][col-1] = 0;
for(i=row-2;i>=0;--i){
for(j=col-2;j>=0;--j){
if(obstacleGrid[i][j] == 1)
p[i][j] = 0;
else
p[i][j] = p[i][j+1] + p[i+1][j];
}
}
return p[0][0];
}
};
版权声明:本文博主原创文章,博客,未经同意不得转载。