动态规划解“不同路径问题”(所有路径、有障碍物时的所有路径)

这篇具有很好参考价值的文章主要介绍了动态规划解“不同路径问题”(所有路径、有障碍物时的所有路径)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目1:不同路径(求到达右下角的所有路径)

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

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

问总共有多少条不同的路径?

动态规划解“不同路径问题”(所有路径、有障碍物时的所有路径),算法,leetcode,c++,矩阵,动态规划 

 解题思路

1.dp[i][j]代表从0,0走到i,j的位置有多少条路径

2.矩阵的左边界和上边界只能是一种走法,要么只能向下走,要么只能向右走

dp[i][0]=1;dp[0][i]=1;

3.到达矩阵其余元素的所有路径可以从上一个元素得来,也可以从左一个元素得来,这里我们求的是到达i,j位置的所有路径之和,所以我们只需要将上边和左边的路径相加即可

dp[i][j]=dp[i][j-1]+dp[i-1][j];

源代码如下:文章来源地址https://www.toymoban.com/news/detail-625764.html

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n));//二维数组dp
        //矩阵左边界只有一种走法,只能向下走
        for(int i=0;i<m;i++)
        {
            dp[i][0]=1;
        }
        //矩阵上边界只有一种走法,只能向右走
        for(int i=0;i<n;i++)
        {
            dp[0][i]=1;
        }
        //dp[i][j]代表从0,0走到i,j的位置有多少条路径
        //dp[i][j]要么是从上一个元素向下走得来,要么是左边一个元素向右走得来
        //所以dp[i][j]=dp[i][j-1]+dp[i-1][j];
        for(int i=1;i<m;i++)
        {
            for(int j=1;j<n;j++)
            {
                dp[i][j]=dp[i][j-1]+dp[i-1][j];
            }
        }
        return dp[m-1][n-1];
    }
};

题目2:不同路径(有障碍物)

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

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

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

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

动态规划解“不同路径问题”(所有路径、有障碍物时的所有路径),算法,leetcode,c++,矩阵,动态规划

 输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径

解题思路:

1.左边界和上边界如果遇到障碍,则障碍后的地方到达路径都为0

2.矩阵中其余元素判断时,如果是障碍物,dp为0

3.动态规划方程:dp[i][j]=dp[i-1][j]+dp[i][j-1];

源代码如下:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m=obstacleGrid.size();//计算矩阵的行
        int n=obstacleGrid[0].size();//计算矩阵的列
        vector<vector<int>> dp(m,vector<int>(n,0));//定义动态规划的二维数组,初始化为0
        //如果矩阵中第一行第一列不是障碍物,则dp[0][0]=1
        if(obstacleGrid[0][0]!=1) dp[0][0]=1;
        //左边界(每个元素只能由上边元素得来)
        for(int i=1;i<m;i++)
        {
            //遇到障碍物就跳过,此时dp[i][0]=0
            if(obstacleGrid[i][0]==1)
            {
                continue;
            }
            dp[i][0]=dp[i-1][0];//其他情况等于上边元素的dp,因为只能由上边一个元素得来
        }
        //上边界,同理
        for(int i=1;i<n;i++)
        {
            if(obstacleGrid[0][i]==1)
            {
                continue;
            }
            dp[0][i]=dp[0][i-1];
        }
        //非左边界和上边界的元素
        for(int i=1;i<m;i++)
        {
            for(int j=1;j<n;j++)
            {
                //跳过障碍物,只有在不是障碍物的情况才更新dp的值
                //动态规划方程:dp[i][j]=dp[i-1][j]+dp[i][j-1]
                //当前位置的走法=上边元素的所有路径+左边元素的所有路径
                if(obstacleGrid[i][j]!=1) 
                {
                    dp[i][j]=dp[i-1][j]+dp[i][j-1];
                }
            }
        }
        //返回右下角元素
        return dp[m-1][n-1];
    }
};

到了这里,关于动态规划解“不同路径问题”(所有路径、有障碍物时的所有路径)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Apollo规划决策算法仿真调试(5):动态障碍物绕行

    Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。Apollo 自动驾驶开放平台为开发者提供了丰富的车辆、硬件选择,强大的环境感知、高精定位、路径规划、车辆控制等

    2024年02月09日
    浏览(70)
  • 【路径规划】粒子群算法求解机器人障碍物环境的Voronoi图路径规划【含GUI Matlab源码 3748期】

    粒子群算法(Particle Swarm Optimization, PSO)可以用于栅格地图上机器人的最短路径规划。在这种问题中,栅格地图被划分为离散的单元格,每个单元格可以是阻挡或可通过的区域。机器人需要从起始位置移动到目标位置,避免碰到阻挡。 PSO算法中,通过使用一群粒子来搜索最优

    2024年01月17日
    浏览(58)
  • Python 动态规划 实现机器人躲避障碍物获取最短路径

    要设计一种算法来寻找机器人从左上角移动到右下角的路径,可以使用动态规划来解决这个问题。下面是一种可能的算法: 创建一个处理机器人运动的函数 find_path ,函数接受一个矩阵 grid 作为参数,用于表示机器人移动的网格环境,该矩阵一个由 0 和 1 组成的二位列表,其

    2024年04月09日
    浏览(42)
  • 百度Apollo规划算法——OBB障碍物检测代码解析

    本文主要分析Apollo代码中函数 bool Box::HasOverlap(const Box2d box) const {} 的数学原理。 在阅读此部分代码时,第一遍没看懂return的一堆什么意思,百度之后说是采用OBB原理,所以就去了解下OBB原理,回来看还是没太明白,直到看到了博客[1],通过博主的图解才有了进一步的了解,但

    2024年02月14日
    浏览(39)
  • ros机器人在navigation下导航costmap_2d动态层(障碍物层)障碍物无法及时消除的情况解决办法

    设备 杉川-3a激光雷达 win10笔记本电脑 ubuntu18.04 ros-melodic 问题 ros机器人在move_base下导航,有静态图层与动态图层,静态图层显示之前已经建立好的地图,而动态层显示现在激光雷达实时扫描到的障碍物。 假设机器人雷达最大范围为8m,在某一时刻,以机器人为原点,在机器人

    2024年02月06日
    浏览(43)
  • ROS从入门到精通2-7:Gazebo仿真之动态生成障碍物

    本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。 🚀详情:《ROS从入门到精通》 动态生成障碍物在机器人工程领域应用非常广泛,例如 机器人导航与路径规划 :动态生成障碍物可以用于评估

    2024年02月11日
    浏览(233)
  • 从零开始的三维激光雷达SLAM教程第二讲(搭建Gazebo仿真环境,并添加动态障碍物)

    毕业设计打算做三维激光SLAM,记录一些学习历程,也给后面人一点帮助。本教程不涉及SLAM基本概念(如果没有自行补充),主要包含以下几部分内容。 搭建激光SLAM的运行环境并运行数据集 在Gazebo中构建仿真地图并添加动态障碍物,使用仿真小车采集激光数据。 A-LOAM详解,

    2024年02月01日
    浏览(48)
  • 【论文阅读】点云地图动态障碍物去除基准 A Dynamic Points Removal Benchmark in Point Cloud Maps

    终于一次轮到了讲自己的paper了 hahaha,写个中文的解读放在博客方便大家讨论 Title Picture Reference and prenotes paper: https://arxiv.org/abs/2307.07260 code: https://github.com/KTH-RPL/DynamicMap_Benchmark b站:地图动态障碍物去除总结 ITSC’23: A Dynamic Points Removal Benchmark in Point Cloud Maps 主要就是2019年末

    2024年02月06日
    浏览(39)
  • unity-障碍物和空气墙的设置

    建个游戏对象,然后给他添加2d碰撞盒子属性 把它放到相机下面,让它成为相机的所属的子组,跟随相机一起移动通过。 创建新的标签便于碰撞确认操作。 ** ** 判断我们游戏操控的物体是否在空气墙上: 额外 : 可以被跨越一类的物体的判断(地刺一类) ​ 其实步骤都和上

    2024年02月13日
    浏览(47)
  • Fluent案例1- 空气流经障碍物-3D模拟

    目录 1. 构建几何模型 2. 生成网格  2.1 生成六面体网格 2.2 生成四面体网格 2.3 生成多面体网格 3. 模拟设置 4. 后处理 4.1 查看不同网格下的压力与速度分布 4.2  查看wall上压力分布 5. 总结  前面的博客介绍了2D的模拟操作步骤,接下来进行3D的建模与计算 将之前建好的2D模型导

    2024年02月11日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包