题目名称: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];
}
};
标签:obstacleGrid,int,路径,网格,uint32,动态,leetcode,dp,size From: https://www.cnblogs.com/FBsharl/p/17930310.html