leetcode第一刷_Unique Paths II

来源:互联网 发布:膝盖伸直有响声 知乎 编辑:程序博客网 时间:2024/06/01 10:37

接着上面的问题,如果这个矩阵中有阻塞的障碍,就不能用前面的那种组合数的方法了,因为很多位置实际上是没有路的嘛。

剩下的合理解法只有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];    }};


0 0
原创粉丝点击