【动态规划】dp 路径问题(不同路径、路径最小和、地下城游戏...)

文章目录

  • 1. 前言 - 理解动态规划算法
  • 1.5 关于dp路径问题
  • 2. 例题
    • 2.1_不同路径
      • Warning. 关于状态表示
  • 3. 算法题
    • 3.1_不同路径II
    • 3.2_珠宝的最高价值
    • 3.3_下降路径最小和
    • 3.4_最小路径和
    • 3.5_地下城游戏
      • 关于状态表示的两种选法:

1. 前言 - 理解动态规划算法

关于 动态规划的理解 与例题,点击👇

【动态规划】C++解决斐波那契模型题目(三步问题、爬楼梯、解码方法…)

有了上面的经验,我们来解下面 dp的路径问题

1.5 关于dp路径问题

  • 在路径问题中,通常需要找到从起点到终点的一条路径,使得路径满足一定的约束条件(如最短路径、最大价值路径等)。

  • 在动态规划中,通常采用一个二维数组或类似的数据结构来存储中间状态,其中每个状态表示从起点到当前位置的某种信息(如路径长度、路径价值等)。

在这里插入图片描述


2. 例题

2.1_不同路径

在这里插入图片描述

思路

  1. 首先 找状态表示 状态转移方程

在这里插入图片描述

Warning. 关于状态表示

实际上在分析状态表示 时,一般会考虑两种表示法

  1. 以(i, j)位置为终点 时的count
  2. 以(i, j)位置为起点 到终点时的count

在本章算法题中,仅最后一道题会涉及到两种表示法,其余的题以第一种即可解题。


  1. 随后进行 对表中内容的初始化 (以及细节问题:填表顺序、返回值)

在这里插入图片描述

代码

class Solution {
public:
    int uniquePaths(int m, int n) {
        // 创建dp表
        vector<vector<int>> dp(m + 1, vector<int>(n + 1)); // 虚拟空间

        // 填写虚拟空间(默认为0!!)
        // for(int i = 0; i <= m; ++i) dp[0][i] = 0;
        // for(int j = 0; j <= n; ++j) dp[j][0] = 0;
        dp[0][1] = 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];
            }

        return dp[m][n];
    }
};

3. 算法题


3.1_不同路径II

在这里插入图片描述

思路

读题后,我们发现本题比起之前的,仅仅加了障碍物的限制。

  • 所以我们只需要在填表时加一句判断即可,当(i, j)位置不为障碍物时,进行填表dp[i][j]。
    • 为什么?
      • 当(i, j)为障碍物,dp[i][j]为0,不做统计。

代码

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size(), n = obstacleGrid[0].size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1)); // 初始化dp数组(虚拟空间+1行1列)
        dp[0][1] = 1;
        
        for(int i = 1; i <= m; ++i)
            for(int j = 1; j <= n; ++j)
            {
                if(obstacleGrid[i - 1][j - 1] == 0) // 虚拟空间多加了一行一列,找初始矩阵时,映射下标要-1
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }

        return dp[m][n];
    }
};

3.2_珠宝的最高价值

在这里插入图片描述

思路

  1. 首先 找状态表示 状态转移方程

在这里插入图片描述

  1. 随后进行 对表中内容的初始化 (以及细节问题:填表顺序、返回值)

在这里插入图片描述

代码

class Solution {
public:
    int jewelleryValue(vector<vector<int>>& frame) {
        int m = frame.size(), n = frame[0].size();
        // dp的创建 与 元素初始化
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));

        for(int i = 1; i <= m; ++i)
            for(int j = 1; j <= n; ++j)
                dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + frame[i-1][j-1]; // 映射下标(对于frame要-1)

        return dp[m][n];
    }
};

3.3_下降路径最小和

在这里插入图片描述

思路

不再过多解释,直接跟着思路五步走:

在这里插入图片描述

在这里插入图片描述

代码

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& matrix) {
        int n = matrix.size();
        vector<vector<int>> dp(n + 1, vector<int>(n + 2, INT_MAX)); // 先初始化为 大值
        for(int j = 0; j <= n + 1; ++j) dp[0][j] = 0; // 将第一行初始化为0
        
        for(int i = 1; i <= n; ++i)
            for(int j = 1; j <= n; ++j)
            {
                // 映射下标,matrix下标-1
                dp[i][j] = min(min(dp[i-1][j], dp[i-1][j-1]), dp[i-1][j+1]) + matrix[i-1][j-1]; 
            }

        // 找最后一行的最小值
        int ret = INT_MAX;
        for(int j = 1; j <= n; ++j) ret = min(ret, dp[n][j]);
        return ret;
    }
};

3.4_最小路径和

在这里插入图片描述

思路

  • 题目分析:本题不再画图,根据题目可以看出来和《珠宝的最高价值》一题是极为相似的,需要注意的是初始化时虚拟空间值的设置。

代码

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX)); // 虚拟空间+1行1列。初始化为无穷大
        dp[0][1] = dp[1][0] = 0;

        for(int i = 1; i <= m; ++i)
            for(int j = 1; j <= n; ++j)
                dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i-1][j-1]; // grid 映射下标(需要-1)

        return dp[m][n];
    }
};


3.5_地下城游戏

在这里插入图片描述

思路

关于状态表示的两种选法:

下面介绍了,为什么对于本题我们无法继续以(i, j)位置为终点,找健康点数
在这里插入图片描述
设置了正确的状态表示才能写出正确的状态转移方程:

在这里插入图片描述
最后进行内容初始化以及其余细节问题:

在这里插入图片描述

代码

class Solution {
public:
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
        int m = dungeon.size(), n = dungeon[0].size();
       // dp[i][j]: 以(i, j)位置开始,到达终点的 最低初始健康点数
        // 右侧下侧扩充一行一列
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
        dp[m-1][n] = dp[m][n-1] = 1; // 初始化

        for(int i = m - 1; i >= 0; --i)
            for(int j = n - 1; j >= 0; --j)
            {
                dp[i][j] = min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j];
                dp[i][j] = max(1, dp[i][j]); // 防止负数血量的出现
            }

        return dp[0][0];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/559711.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch 之torch.nn初探 池化--Pooling Layers

任务描述 本关任务&#xff1a;本关提供了一个Variable 类型的变量x&#xff0c;要求按照条件创建一个Conv2d变量conv&#xff0c;一个MaxPool2d变量pool&#xff0c;对x应用卷积和最大池化操作并赋值给变量outpout_pool&#xff0c;并输出outpout_pool 的大小。 相关知识 P…

Blerden4.1基础操作方法

软件安装 下载软件地址 中文文档 偏好设置 编辑——》偏好设置——》界面——》设置分辨率缩放 1.20 方便观看字体 设置快捷键 是为了方便几个3d软件都变成同一种操作方式 这样就不会自己搞混了 编辑——》偏好设置——》键位映射——》3D视图——》3D视图&#xff08;全局…

将windows作为网关

开启转发 reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v IPEnableRouter /D 1 /f开启routing and remote access服务 这样局域网里面别的设备能通过windows进行上网 参考&#xff1a;https://www.cnblogs.com/chrishg/articles/12861053.html

Springboot+Vue项目-基于Java+MySQL的房屋租赁系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

OceanBase V4.2特性解析:用 Show Trace 快速定位数据库性能瓶颈

在数据库日常运维中&#xff0c;当遇到慢SQL问题时&#xff0c;若无法迅速查明原因&#xff0c;将极大地影响用户的使用感受&#xff0c;甚至可能引发业务或服务的中断。相较于单机数据库&#xff0c;分布式数据库系统因其涉及多个节点和多组件的协同工作&#xff0c;集群规模可…

短视频流媒体平台的系统设计

1. 功能需求: 我们的系统有两类参与者 内容创作者 •上传任何类型的视频&#xff08;格式编解码器&#xff09;•视频可以被删除•视频元数据•必填项: 标题&#xff0c;作者&#xff0c;描述•选填项: 分类/标签列表•可以随时更新•当视频对观众可用时&#xff0c;向内容创作…

怎么把相机储存卡里的照片导出来?介绍两种方法

随着摄影技术的不断发展和普及&#xff0c;相机已成为我们记录生活、捕捉美好瞬间的设备。然而&#xff0c;对于许多摄影爱好者来说&#xff0c;如何将相机储存卡里的照片安全、高效地导出到电脑或其他设备中&#xff0c;却成为了一个令人头疼的问题。本文将为您详细介绍从相机…

17.C++常用的算法_集合算法

文章目录 遍历算法1. set_intersection()代码工程运行结果 2. set_union()代码工程运行结果 3. set_difference()代码工程运行结果 遍历算法 1. set_intersection() 代码工程 /*1.求交集的两个集合必须是有序序列*/ /*2.目标容器开辟空间需要从两个容器中取较小值*/ /*3.set…

小程序中使用HTTPS调用自带文本安全内容检测接口(msg_sec_check)的实现方法

在小程序中调用自带的文本安全内容检测接口&#xff0c;你需要使用小程序提供的wx.request方法。以下是一个示例代码&#xff1a; javascript代码: // 假设你已经获取了access_token,如果不知道如何获取&#xff0c;可以参考我上一篇文章 const access_token 你的access_tok…

【结构型模式】外观模式

​一、外观模式概述 外观模式定义与意图&#xff1a;外观类为复杂的子系统提供了一个统一的入口。外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。&#xff08;对象结构型模式&#xff09; 外观模式的特点&#xff1a; 1.又叫做门面模式&#xf…

电磁炉原理笔记

电磁炉加热原理 【电磁炉工作原理&#xff0c;电涡流感应加热原理】 https://www.bilibili.com/video/BV11M411M7Wt/?share_sourcecopy_web&vd_source44c5c5fe44538189ece80f09460cf625 我是看的这个科普视频&#xff1b; 总结一下就是下图&#xff1a; 线圈的磁场影响…

链表判环问题

1、为什么slow走一步&#xff0c;fast走两步&#xff0c;会不会错过&#xff1f;请证明。 假设slow进环的时候fast和slow之间的距离时N&#xff0c;slow进环以后&#xff0c;fast开始追击slow每走一步&#xff0c;fast走2步&#xff0c;他们之间的距离缩小1. fast和slow之间的…

“三步走”带你拿下C++类与对象(下)

在学习了“上”篇和“中”篇后&#xff0c;我们对类和对象以及一些析构函数有了一定的理解&#xff0c;本文我们将继续深入讲解有关的其他内容。 一、初始化列表的引入 我们以之前的队列为例子&#xff08;创建两个队列一个用于入栈一个用于出栈&#xff09; 这个myqueue对内…

全志R329 AP6256 蓝牙调试

1、在全志r329平台移植AP6256,移植了一个星期,记录下过程。 2、本来产品只需要wifi,不需要蓝牙的。但是我们使用的是正基AP6256的wifi、BT二合一的模组。 该模块只要有BT功能就需要做BT的3C认证。 好吧。 1、获取调试蓝牙的几个工具 两个方法: 1.1、方法一:自己交叉…

蓝桥杯2024年第十五届省赛真题-爬山

贪心优先队列的题&#xff0c;贪心会漏一个情况&#xff0c;不知道怎么处理&#xff0c;这里直接打表了 2 1 1 48 49 答案是30&#xff0c;贪心是31 专有名词&#xff1a;hack-有新的测试点过不了 #include<bits/stdc.h> using namespace std; #define endl \n #define …

QT C++ sqlite 对多个数据库的操作

//本文描述&#xff0c;QT 对多数据库的操作。 //你可能会想&#xff0c;多数据库的操作时&#xff0c;查询语句怎么知道是哪个数据库。 //QT提供了这样一种构造函数 QSqlQuery(const QSqlDatabase &db) //指定数据库 //在QT6.2.4 MSVC2019调试通过。 //效果见下图&am…

HarmonyOs开发:导航tabs组件封装与使用

前言 主页的底部导航以及页面顶部的切换导航&#xff0c;无论哪个系统&#xff0c;哪个App&#xff0c;都是最常见的功能之一&#xff0c;虽然说在鸿蒙中有现成的组件tabs可以很快速的实现&#xff0c;但是在使用的时候&#xff0c;依然有几个潜在的问题存在&#xff0c;第一&a…

12. MyBatis(二)

源码位置&#xff1a;MyBatis_demo 上篇文章我们学习了MyBatis的定义以及增删查改操作&#xff0c;并且学习了如何在xml文件中编写SQL时使用#{}的方式将参数和对象的属性映射到SQL语句中&#xff0c;上篇的内容已经足以应对大部分场景&#xff0c;本篇文章我们就要学习一下MyBa…

测绘管理与法律法规 | 测绘资质管理办法 | 学习笔记

目录 一、测绘资质概述 二、测绘资质分类与等级 三、审批与管理 四、申请条件 五、审批程序 六、测绘资质证书 七、监督管理 八、违规处理 九、特殊规定 十、审批受理时间要点补充 1. 审批机关决定是否受理的时间 2. 审批机关作出批准与否的决定时间 3. 颁发测绘资…

linux /proc进程文件目录介绍

参考&#xff1a;https://zhuanlan.zhihu.com/p/619966043 有时候想只查出来进程号&#xff0c;可以通过/proc/下查出该进程的运行及执行脚本情况信息 /proc/pid子目录 记录了进程的相关信息cmdline文件&#xff1a;包含了进程启动时使用的完整命令行参数。 cwd符号链接&#x…