【动态规划算法】不同路径_不同路径升级版

简介: 【动态规划算法】不同路径_不同路径升级版

动态规划五步曲

1.确定dp及dp[i]的含义

2.找出递推公式

3.确定dp数组如何初始化

4.确定遍历顺序

5.打印dp数组验证

一、不同路径

点我直达

思路:动态规划

由题意易知,dp数组需要使用二维。

  • 1.确定dp数组以及dp[i][j]的含义

dp[i][j]的含义是:到达下标i,j位置有dp[i][j]种路径

  • 2.递推公式

由题意我们可以知道,机器人只能向右走或者向下走,所以只有两种情况能走到dp[i][j]位置,如下图:

即:dp[i-1][j]往下走一步就能到达dp[i][j]位置,或者dp[i][j-1]往右走一步就能达到dp[i][j]位置。

所以到达dp[i][j]位置有:

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

注意这里存在一个误区:可能你会觉得
dp[i][j] = dp[i-1][j]+1+dp[i][j-1] + 1

产生这样想法的原因是你没有搞清楚dp[i][j]的含义是什么

dp[i][j]的含义是到达下标i,j位置有多少种路径,而不是走了多少步,如果是走了多少步,那么就可以从dp[i-1][j]往下+1,或者dp[i][j-1]往右+1。

  • 3.如何进行初始化

    我们知道,从dp[0][0]位置开始的第一行和第一列的任意位置,都只有一种方法能够到达。
    因为只能向右走或者向下走,比如到达dp[0][5]位置,只能有一条路径可以到达。

所以第一行和第一列的所有位置都需要初始化成1。

  • 4.确定遍历顺序
    根据题意可知,dp数组是需要从左到由从上到下遍历的。
  • 5.打印dp数组进行验证

具体代码如下:

//动态规划五步曲:
//1.确定dp[i][j] 的含义:
//到达dp[i][j] 位置一共有多少种不同路径
//2.确定递推公式
//dp[i][j] = dp[i-1][j] + dp[i][j-1];
//到dp[i-1][i]的路径量+到dp[i][j-1]的路径量。
//3.确定如何初始化
//最左边一行和最上边一行全部初始化成1,因为题目要求只能向下或者向右移动一步最上边一行到任意位置只有一种路径,最左边一行到任意位置也只有一种路径。
//4.确定遍历顺序,由题意可知,只能从左到右,从上到下进行遍历。
//5.打印dp数组的值
class Solution {
public:
    int uniquePaths(int m, int n) 
    {
        int dp[m][n];
        for(int i = 0;i<m;++i)
        {
            dp[i][0] = 1;
        }
        for(int j = 0;j<n;++j)
        {
            dp[0][j] = 1;
        }
        for(int i = 1;i<m;++i)
        {
            for(int j = 1;j<n;++j)
            {
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
                printf("%d ",dp[i][j]);
            }
        }
        return dp[m-1][n-1];
    }
};

时间复杂度O(m*n),空间复杂度O(m*n)

二、不同路径(升级版)

点我直达!

思路:动态规划

大致的情况与第一题相同,只不过在路上会遇到障碍物。

有障碍物的位置为1,没有障碍物的位置为0。

但是在初始化的地方和递归的过程是有一点不同的。

在初始化时:

该情况,当我们在第一行或者第一列的初始化位置遇到障碍物时

在障碍物以及之后的所有位置,都不能被初始化,因为一旦遇到障碍物,就没有办法继续往后走了。

还有一种情况是:障碍物在起点或者终点,都无法获取路径,直接返回0即可。

所以在初始化的时候我们应该这样写代码:

//初始化有障碍物,遇到障碍物及其之后的位置不能再初始化成1了,就跳过
for(int i = 0;i < m && obstacleGrid[i][0] != 1;++i)
{
    dp[i][0] = 1;
}
for(int j = 0;j<n && obstacleGrid[0][j] != 1;++j)
{
    dp[0][j] = 1;
}

2.在进行递推时

如果我们在如图所示的地方遇到了障碍物,我们就不能再递推了,就需要直接跳过该位置。(且题目的意思,障碍物的地方路径数是0)

所以我们应该这样写代码:

for(int i = 1;i<m;++i)
        {
            for(int j = 1;j<n;++j)
            {
                if(obstacleGrid[i][j] == 1)
                    continue;
                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));
        //初始化有障碍物,遇到障碍物及其之后的位置不能再初始化成1了,就跳过
        for(int i = 0;i < m && obstacleGrid[i][0] != 1;++i)
        {
            dp[i][0] = 1;
        }
        for(int j = 0;j<n && obstacleGrid[0][j] != 1;++j)
        {
            dp[0][j] = 1;
        }
        for(int i = 1;i<m;++i)
        {
            for(int j = 1;j<n;++j)
            {
                if(obstacleGrid[i][j] == 1)
                    continue;
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }
};

时间复杂度O(m*n),空间复杂度O(m*n)

总结

今天写了动态规划不同路径,我发现跟着b站大佬的学习视频学动态规划特别爽~

继续干动态规划!

相关文章
|
1月前
|
机器学习/深度学习 算法 C++
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
题目要求根据城堡北墙和西墙箭靶上的箭数,推断骑士从西北角到东南角的唯一路径。每步移动时向正北和正西各射一箭,同一格不重复经过。通过DFS回溯模拟“拔箭”过程,验证路径合法性。已知箭数约束路径唯一,最终按编号输出行走顺序。
|
2月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
197 3
|
2月前
|
机器学习/深度学习 存储 算法
动态规划算法深度解析:0-1背包问题
0-1背包问题是经典的组合优化问题,目标是在给定物品重量和价值及背包容量限制下,选取物品使得总价值最大化且每个物品仅能被选一次。该问题通常采用动态规划方法解决,通过构建二维状态表dp[i][j]记录前i个物品在容量j时的最大价值,利用状态转移方程避免重复计算子问题,从而高效求解最优解。
444 1
|
3月前
|
算法 机器人 定位技术
【VRPTW】基于matlab秃鹰算法BES求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)(Matlab代码实现)
【VRPTW】基于matlab秃鹰算法BES求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)(Matlab代码实现)
116 0
|
2月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
199 2
|
2月前
|
机器学习/深度学习 传感器 算法
基于全局路径的无人地面车辆的横向避让路径规划研究[蚂蚁算法求解](Matlab代码实现)
基于全局路径的无人地面车辆的横向避让路径规划研究[蚂蚁算法求解](Matlab代码实现)
202 8
|
2月前
|
算法 数据挖掘 区块链
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
110 2
|
2月前
|
存储 算法 数据可视化
基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
本程序基于禁忌搜索算法解决旅行商问题(TSP),旨在寻找访问多个城市的最短路径。使用 MATLAB 2022A 编写,包含城市坐标生成、路径优化及结果可视化功能。通过禁忌列表、禁忌长度与藐视准则等机制,提升搜索效率与解的质量,适用于物流配送、路径规划等场景。
|
2月前
|
机器学习/深度学习 负载均衡 算法
【卡车和无人机协同配送路径优化】遗传算法求解利用一辆卡车和两架无人机配合,将小包裹递送给随机分布的客户,以使所有站点都由卡车或无人机递送一次后返回起始位置(中转站)研究(Matlab代码实现)
【卡车和无人机协同配送路径优化】遗传算法求解利用一辆卡车和两架无人机配合,将小包裹递送给随机分布的客户,以使所有站点都由卡车或无人机递送一次后返回起始位置(中转站)研究(Matlab代码实现)
243 7
|
2月前
|
机器学习/深度学习 传感器 算法
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)
125 1

热门文章

最新文章

下一篇
oss云网关配置