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

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

动态规划五步曲

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语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
57 4
|
2月前
|
存储 算法
深入了解动态规划算法
深入了解动态规划算法
69 1
|
2月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
1月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
50 2
|
2月前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
99 2
动态规划算法学习三:0-1背包问题
|
1月前
|
机器学习/深度学习 人工智能 算法
青否数字人声音克隆算法升级,16个超真实直播声音模型免费送!
青否数字人的声音克隆算法全面升级,能够完美克隆真人的音调、语速、情感和呼吸。提供16种超真实的直播声音模型,支持3大AI直播类型和6大核心AIGC技术,60秒快速开播,助力商家轻松赚钱。AI讲品、互动和售卖功能强大,支持多平台直播,确保每场直播话术不重复,智能互动和真实感十足。新手小白也能轻松上手,有效规避违规风险。
|
2月前
|
数据采集 监控 安全
厂区地图导航制作:GIS技术与路径导航算法融合
在智能化、数字化时代,GIS技术为厂区的运营管理带来了革命性变化。本文探讨了如何利用GIS技术,通过数据采集、地图绘制、路径规划、位置定位和信息查询等功能,打造高效、精准的智能厂区地图导航系统,提升企业的竞争力和管理水平。
78 0
厂区地图导航制作:GIS技术与路径导航算法融合
|
2月前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
79 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
2月前
|
算法
动态规划算法学习二:最长公共子序列
这篇文章介绍了如何使用动态规划算法解决最长公共子序列(LCS)问题,包括问题描述、最优子结构性质、状态表示、状态递归方程、计算最优值的方法,以及具体的代码实现。
169 0
动态规划算法学习二:最长公共子序列
|
2月前
|
存储 人工智能 算法
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)