动态规划(dynamic programming)之:unique-paths(求路径总数)

 (1)unique_paths 1


题⽬要求:给定m x n矩阵,求左上⻆到右下⻆的路径总数,每次只能向左或者向右前进。按照动态规
划中矩阵类问题的通⽤⽅法:
1. State: f[m][n] 从起点到坐标(m,n)的路径数⽬
2. Function: f[m][n] = f[m-1][n] + f[m][n-1] 分析终点与左边及右边节点的路径数,发现从左边或者右
边到达终点的路径⼀定不会重合,相加即为唯⼀的路径总数
3. Initialization: f[i][j] = 1, 到矩阵中任⼀节点均⾄少有⼀条路径,其实关键之处在于给第0⾏和第0列
初始化,免去了单独遍历第0⾏和第0列进⾏初始化
4. Answer: f[m - 1][n - 1]

class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m < 1 || n < 1)
            return 0;
        vector<vector<int> > res(m, vector<int>(n,1));
        for(int i = 1; i < m; ++i){
            for(int j = 1; j < n; ++j)
                res[i][j] = res[i-1][j] + res[i][j-1];
        }
        return res[m-1][n-1];
    }
};

(2)unique_paths 2

 在上一个问题上加了障碍物,则意味着,凡是遇到障碍物,其路径数马上变为0;

这一步和上面的问题的区别在于要判断是否有障碍物,因此对于初始化矩阵也有了区别

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
        if(obstacleGrid.empty() || obstacleGrid.empty())
            return 0;
        int M = obstacleGrid.size();
        int N = obstacleGrid[0].size();
        
        vector<vector<int> > res(M, vector<int>(N,0));
        for(int i = 0; i <M; ++i){
            if(obstacleGrid[i][0] == 1)    //只要遇到了1,那么后面的路径就都不通,为0
                break;
            else
                res[i][0] = 1;
        }
        for(int i = 0; i < N; ++i){
            if(obstacleGrid[0][i] == 1)    //只要遇到了1,那么后面的路径就都不通,为0
                break;
            else
                res[0][i] = 1;
        }
        for(int i = 1; i < M; ++i){
            for(int j = 1; j < N; ++j){
                if(obstacleGrid[i][j] == 1)    //如果当前有障碍区,这道这里的路劲为0
                    res[i][j] = 0;
                else
                    res[i][j] = res[i-1][j] + res[i][j-1];
            }
        }
        return res[M-1][N-1];
    }
};

猜你喜欢

转载自blog.csdn.net/ypshowm/article/details/89341661