【动态规划】leetcode 不同路径问题

发布时间 2023-12-27 12:38:49作者: FBshark

题目名称:63. 不同路径 II

链接:https://leetcode.cn/problems/unique-paths-ii/description/

题目内容:

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

 

朴素解法:使用dp[m][n] 

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size();
        int n = (*obstacleGrid.begin()).size();
     
        uint32_t *dp = new uint32_t[m*n]();
        if(obstacleGrid[0][0] == 0)//没有障碍物
        {
             *dp = 1;
        }
        else
        {
            *dp = 0;
            return 0;
        }


        for(int i=0; i<m; i++)//行数 [0, m-1]共m行
        {
            int j = 0;
            if(i==0) j=1;//跳过原点

            for(; j<n; j++)//列数[0, n-1]共n列
            {
                if(obstacleGrid[i][j] == 1)//当前有障碍物
                {
                    *(dp+j+n*i) = 0;//dp[i][j]=0 
                }
                else
                {
                    if(i>0&&j>0)
                    {
                        *(dp+j+n*i) = *(dp+j+(n)*(i-1)) + *(dp+(j-1)+(n)*i);//dp[i][j] = dp[i-1][j]+dp[i][j-1]
                    }
                    else if(i==0)//第一行(原点除外)
                    {
                         *(dp+j) =  *(dp+(j-1));  
                    }
                    else if(j==0)//第一列(原点除外)
                    {
                         *(dp+n*i) = *(dp+(n)*(i-1));
                    }
                }
            }
        }
        return *(dp+n*m-1);
    }
};

 

 

滚动数组解法:使用dp[n] 

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size();
        int n = (*obstacleGrid.begin()).size();
     
        uint32_t *dp = new uint32_t[n]();
        dp[0] = (obstacleGrid[0][0] == 0);
        
        for(int i=0; i<m; i++)//行数 [0, m-1]共m行
        {
            for(int j=0; j<n; j++)//列数[0, n-1]共n列
            {
                if(obstacleGrid[i][j] == 1)//当前有障碍物
                {
                    dp[j] = 0;//dp[i][j]=0 
                }
                else//当前没有障碍物//dp[i][j] = dp[i-1][j]+dp[i][j-1]
                {
                    if(j!=0)
                    {
                        dp[j] = dp[j]+dp[j-1];
                    }
                }
            }
        }
        return dp[n-1];
    }
};