【动态规划】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) // 虚拟空间多加了一行一列,找初始矩阵时,映射下标要-1dp[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; // 将第一行初始化为0for(int i = 1; i <= n; ++i)for(int j = 1; j <= n; ++j){// 映射下标,matrix下标-1dp[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];}
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超越GPT-4V,苹果多模态大模型上新,神经形态计算加速MLLM(一)

4月8日&#xff0c;苹果发布了其最新的多模态大语言模型&#xff08;MLLM &#xff09;——Ferret-UI&#xff0c;能够更有效地理解和与屏幕信息进行交互&#xff0c;在所有基本UI任务上都超过了GPT-4V&#xff01; 苹果开发的多模态模型Ferret-UI增强了对屏幕的理解和交互&am…

做生意能只用电子名片吗?

做生意&#xff0c;收到纸质名片是不可避免的&#xff0c;电子名片不可能完全能代替纸质名片&#xff0c;如果想方便管理纸质名片的话&#xff0c;将名片拍照转为Excel是一种不错的方案&#xff0c;它可以让我们方便地通过表格筛选或搜索需要的信息&#xff0c;极大地提高了信息…

cdh cm界面HDFS爆红:不良 : 该 DataNode 当前有 1 个卷故障。 临界阈值:任意。(Linux磁盘修复)

一、表现 1.cm界面 报错卷故障 检查该节点&#xff0c;发现存储大小和其他节点不一致&#xff0c;少了一块物理磁盘 2.查看该磁盘 目录无法访问 dmesg检查发现错误 dmesg | grep error二、解决办法 移除挂载 umount /data10 #可以移除挂载盘&#xff0c;或者移除挂载目…

【C语言】深入解析选择排序算法

一、算法原理二、算法性能分析三、C语言实现示例四、总结 一、算法原理 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的工作原理是不断地选择剩余元素中的最小&#xff08;或最大&#xff09;元素&#xff0c;放到已排序的序列的末尾&#xff…

RCE漏洞及其绕过——[SWPUCTF 2021 新生赛]easyrce、caidao、babyrce

目录 什么是Shell 1、Shell简介 2、印刷约定 一、什么是RCE 漏洞产生条件&#xff1a; 漏洞检测&#xff1a; 1.远程命令执行 system()函数&#xff1a; passthru()函数&#xff1a; exec()函数&#xff1a; 无回显 shell_exec()函数&#xff1a; 2.远程代码执行 e…

【算法刷题day28】Leetcode:93.复原IP地址 78.子集 90.子集II

93.复原IP地址 文档链接&#xff1a;[代码随想录] 题目链接&#xff1a;93.复原IP地址 题目&#xff1a; 给定一个只包含数字的字符串&#xff0c;复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;…

【React】Ant Design自定义主题风格及主题切换

Ant Design 的自定义主题&#xff0c;对于刚入手的时候感觉真是一脸蒙圈&#xff0c;那今天给它梳理倒腾下&#xff1b; 1、自定义主题要点 整体样式变化&#xff0c;主要两个部分&#xff1a; 1.1、Design Token https://ant.design/docs/react/customize-theme-cn#theme 官…

2024信友队智灵班春季 Test1 总结

4月模考 死亡回放 模考时间线 1:30 比赛开始&#xff0c;读 T1 宇宙爆炸 的题1:50 自己手模了几组样例&#xff0c;得出了一个错误结论&#xff0c;打出了第一版错误代码&#xff0c;然后上交&#xff08; Wrong Answer 20 \color{red}\text{Wrong\ Answer\ 20} Wrong Answer …

【Vue 异步更新和 $nextTick】

文章目录 异步更新机制$nextTick 方法 异步更新机制以及 $nextTick 方法都与 Vue 的响应式系统密切相关&#xff0c;对于开发高效、流畅的应用至关重要。 异步更新机制 Vue 的数据更新是异步执行的。修改 Vue 实例的数据时&#xff0c;Vue 并不会立即更新 DOM。它将数据变更放…

每日一题(PTAL2-008):最长对称子串--分类讨论+遍历

最长对称子串的长度有可能是奇数也有可能是偶数&#xff0c;因此在遍历时要同时考虑这两种情况。 #include<bits/stdc.h> using namespace std;int main() {string s;getline(cin,s);int n s.size();int res 0; // 初始化为0&#xff0c;因为空字符串也是对称的for (i…

VMware最新下载安装

1、打开浏览器 搜索VMware官网&#xff0c;点进去。如图&#xff1a; 这里有两种下载方法&#xff0c;便洁就是我这种&#xff0c;还有一种就是注册账号之后下载就完全没有必要了&#xff0c;而且基本注册不了&#xff0c;不太好注册。 2、选择"产品"第二个选项 …

Oracle数据库从入门到精通系列之二十:Linux上使用容器数据库(CDB)方式部署Oracle数据库19c详细步骤

@TOC 一、Oracle 数据库部署类型 Oracle数据库支持以下部署类型: 容器数据库(CDB) 可以包含多个可插入数据库 (PDB) 的数据库。数据库客户端连接到每个 PDB,就好像它是标准的非 CDB 数据库一样。非容器数据库(非CDB) 标准Oracle数据库,不支持创建可插拔数据库。二、安…

OPTEE RUST支持构建并运行支持RUST的CA和TA

目录 一、RUST环境及代码准备 二、RUST构建演示 三、RUST运行演示 RUST语言,由于其更安全的编程语言特性,OPTEE作为可信执行环境的开源实现也增加了对RUST的支持。那么如何构建并运行支持RUST的CA和TA呢,本博客来探讨并进行qemu环境的实际演示。 一、RUST环境及代码准备…

从容器到协调:掌握Docker和Docker Compose的艺术

Docker 是一个开源的应用容器引擎&#xff0c;允许开发者打包他们的应用以及应用的依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#xff08;类似 iPhon…

简单易学版 易操作版 man永久汉化 和help永久汉化 linux中

help 汉化 1 查看当前语言 echo $LANG locale 2 查看是否存在中文语言包 locale -a | grep zh_CN 3 没有就安装 yum install kde-l10n-Chinese 4 永久修改 vim /etc/locale.conf LANG"zh_CN.UTF-8" 重启后生效 或者 localectl set-l…

leetcode热题100.杨辉三角(动态规划入门)

Problem: 118. 杨辉三角 文章目录 题目思路复杂度Code 题目 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,…

98.验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 方法一&#xff1a;中序…

Go语言并发控制

channel // cancelFn 数据通道关闭通知退出 func cancelFn(dataChan chan int) {for {select {case val, ok : <-dataChan:// 关闭data通道时&#xff0c;通知退出// 一个可选是判断data指定值时退出if !ok {fmt.Printf("Channel closed &#xff01;&#xff01;&…

OPEN CV 实现车辆统计

#加载视频 import cv2 import numpy as np cap cv2.VideoCapture(car.mp4) #去除背景 mog cv2.bgsegm.createBackgroundSubtractorMOG() kernel cv2.getStructuringElement(cv2.MORPH_RECT,(7,7)) min_w90 min_h90 line_hig400 #偏移量 offset2 cars[] carno0 #计算外矩形的中…

5. Django 探究CBV视图

5. 探究CBV视图 Web开发是一项无聊而且单调的工作, 特别是在视图功能编写方面更为显著. 为了减少这种痛苦, Django植入了视图类这一功能, 该功能封装了视图开发常用的代码, 无须编写大量代码即可快速完成数据视图的开发, 这种以类的形式实现响应与请求处理称为CBV(Class Base…