Lintcode-动态规划-不同路径二

来源:互联网 发布:华为网络管理系统 编辑:程序博客网 时间:2024/06/14 10:44

点击进入题目

解题思路:该题目的解题思路和不同路径的思路基本是一致的,只是有少许不同而已,顶多在解决问题的时候先判断是否有障碍。

解题过程:首先给定m,n的值和数组obstacleGri[m][n],定义数组f[m][n],定义第一行和第一列为1,但当obstacleGri[1][j]为0时,则从f[1][j]到f[1][n]全为0,列也类似。初始化完了以后,就开始做判断。嵌套for循环,i从1 到m,j从1到n,当obstacleGri[i][j]!=0时,运行f[i][j]=f[i-1][j]+f[i][j-1];

代码实现:

 int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid) {
        int m=obstacleGrid.size(),n=obstacleGrid[0].size();
         int f[m][n];
         int I=0;
    for(int i=0;i<m;i++)
    {
        f[i][0]=1;
        if(obstacleGrid[i][0]==1||I)
               {
                   f[i][0]=0;
                   I++;
               }
    }
    I=0;
    for(int i=0;i<n;i++)
    {
        f[0][i]=1;
        if(obstacleGrid[0][i]==1||I)
               {
                   f[0][i]=0;
                   I++;
               }
    }
    for(int i=1;i<m;i++)
        {
           for(int j=1;j<n;j++)
           {
               f[i][j]=0;
               if(obstacleGrid[i][j]!=1)
               {
                   f[i][j]=f[i-1][j]+f[i][j-1];
               }
       
           }
        }
    return f[m-1][n-1];
    }

注意事项:在处理这道问题的时候一定要注意障碍物这个问题,而且在初始化的时候,要注意一些问题,当边缘出现障碍物的时候,那么再往下或者往右就走不通了,那么处于边缘的一些节点都要赋值为0;

个人见解:这道题目稍难了一些,但是如果理清思路,以及注意一些要点,还是挺简单的就过去了。