【动态规划】leetcode 不同路径问题
题目名称: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];
}
};
合集:
牛客华为面试题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2022-12-27 win+R运行打开画图软件\计算器\命令行\控制面板
2018-12-27 Getting started with Processing 第十三章——延伸(2)