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

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

题目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日
    浏览(37)
  • 【路径规划】粒子群算法求解机器人障碍物环境的Voronoi图路径规划【含GUI Matlab源码 3748期】

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

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

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

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

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

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

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

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

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

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

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

    2024年02月01日
    浏览(36)
  • 【论文阅读】点云地图动态障碍物去除基准 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日
    浏览(31)
  • 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日
    浏览(44)
  • unity-障碍物和空气墙的设置

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

    2024年02月13日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包