动态规划算法:10.路径问题_地下城游戏_C++

 目录

题目链接:174. 地下城游戏 - 力扣(LeetCode)

一、题目解析

题目:​编辑

解析:

二、算法原理

1、状态表示

2、状态转移方程

状态转移方程推理:

3、初始化

dp表初始化:

特殊位置初始化:

4、填表顺序

5、返回值

三、编写代码


题目链接:174. 地下城游戏 - 力扣(LeetCode)

一、题目解析

题目:

解析:

  我们由题目可以知道,我们骑士的最低血量就是我们要求得最小初始值,我们要求骑士拯救公主后血量在0以上,那么最小的时候是什么情况:

  • 如果拯救公主时,有守卫守护,那么我们希望拯救完公主后,血量为1
  • 如果拯救公主时,没有首位守护,或者有健康点数可以增加,那么我们希望拯救公主前,血量为1

并且在以上过程中,骑士的血量不可以降至0或者0以下

二、算法原理

1、状态表示

我们在状态标识的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。 

  状态简单理解就是dp表内某一个值代表的含义。

如何确定状态表示

  • 题目要求

   简单的题目里一般会给出

  • 经验+题目要求

  越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。

  • 分析问题的过程中,发现重复子问题

 分析问题的过程中把重复子问题抽象成我们的状态表示,这个更难理解,一切的基础都是我们先对动态规划算法熟练运用。我也不懂,我们慢慢来。

综上:我们通常会以一个位置为结尾或者开始求得我们想要的答案

那我们的这道题得状态表示是什么样的:

根据经验,我们在此以一个位置为开始解题

为什么这次我们以一个位置为开始,但是之前都是以一个位置为结尾呢?

如果以一个位置为结尾解题,那么该点应该表示,到达该位置时需要的最小生命值,那么如果下一个位置的值是一个负数呢?我们只能保证通过该位置,但是并不能保证安全通过下一个位置,所以我们以一个位置为开始解题,也就是从该位置开始,到达终点所需要的最小生命值

状态表示:dp[i][j]表示,从(i,j)位置开始,到达终点所需要的最小生命值

2、状态转移方程

 确定状态表示之后我们就可以根据状态标识推出状态转移方程

  状态转移方程是什么?

不讲什么复杂的,简单来说状态转移方程就是    dp[i][j]等于什么 dp[i][j]=?

  这个就是状态转移方程,我们要做的,就是推出dp[i][j]等于什么

  我们根据状态表示再结合题目+经验去推理转移方程,这一步也是我们整个解题过程中最难的一步

  我们在这道题先简单了解下什么是状态转移方程,之后比较难的题目再细推

状态转移方程推理:

  我们考虑从右下往左上进行动态规划。令 dp[i][j] 表示从坐标 (i,j) 到终点所需的最小初始值。换句话说,当我们到达坐标 (i,j) 时,如果此时我们的路径和不小于 dp[i][j],我们就能到达终点

  这样一来,我们就无需担心路径和的问题,只需要关注最小初始值。对于 dp[i][j],求从位置(i,j)到达终点的最小值,我们只要关心 dp[i][j+1] 和 dp[i+1][j] 的最小值 min,减去(i,j)位置的值,就是我们所求的dp[i][j]了,同时,初始值还必须大于等于 1。这样我们就可以得到状态转移方程:

状态转移方程:dp[i][j]=max(min(dp[i+1][j],dp[i][j+1])−(i,j)位置的值,1)

3、初始化

 我们创建dp表就是为了把他填满,我们初始化是为了防止在填表的过程中越界

怎么谈越界?

dp表初始化:

如果我们的dp表创建成与原表大小相同,那么在处理最后一个值时,其根本没有dp[i][j+1]与dp[i+1][j],这就会造成越界,不仅如此,我们dp表的最后一行,也不会有dp[i+1][j],dp表的最后一列,也不会有dp[i][j+1]

所以我们就需要额外的增加一行一列,来保证我们填表的时候不越界

  我们在对整个dp表初始化时,我们不能让新增的值影响原有数据填表,根据状态方程我们知道,新增的值会与原数据进行一个比较,从而选择较小的那个,所以我们在整体初始化时,把所有的值初始化为INT_MAX,这样就不会影响了。

特殊位置初始化:

  我们填表的第一个值是原数据的最后一个值,也就是公主所在的位置,此时,其dp[i][j+1]与dp[i+1][j]都是INT_MAX,并没有原数据在其中比较,所以根据状态转移方程我们知道,如果都是INT_MAX的话,该位置最终也会是INT_MAX,最终影响填表。该位置就是终点,这个位置的如果是正数的话,其dp值应该为1,如果是负数,那么它的dp值应该是(1-该位置的值)。所以为了保证该位置填表正确,不影响之后填表,我们需要把其dp[i][j+1]和dp[i+1][j]设置为1即可。

4、填表顺序

从下到上,从右到左依次填表

5、返回值

dp表的第一个值,也就是dp[0][0]

三、编写代码

class Solution {
public:int calculateMinimumHP(vector<vector<int>>& d) {int m =d.size(),n=d[0].size();
//1、创建dp表vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));
//2、特殊位置初始化dp[m-1][n]=1;dp[m][n-1]=1;
//3、填表for(int i=m-1;i>=0;i--){for(int j=n-1;j>=0;j--){
//这里我将状态转移方程拆开来写了dp[i][j]=min(dp[i][j+1],dp[i+1][j])-d[i][j];dp[i][j]=max(dp[i][j],1);}}
//4、返回值return dp[0][0];}
};

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【AcWing】基础算法

目录 1、快速排序 1.1 快速排序 1.2 第k个数 2、归并排序 2.1 归并排序 2.2 逆序对的数量 3、二分 3.1 数的范围 3.2 数的三次方根 4、高精度 4.1 高精度加法 4.2 高精度减法 4.3 高精度乘法 4.4 高精度除法 5、前缀和与差分 5.1 前缀和 5.2 子矩阵的和 5.3 …

基于jsp的图书馆管理系统的设计与实现 (含源码+sql+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于jsp的图书馆管理系统8拥有两种角色&#xff0c;分别为管理员和学生&#xff0c;具体功能如下&#xff1a; 管理员&#xff1a;图书管理、用户管理、违规处理、权限管理、个人信息修改…

某恩加密数据爬虫逆向分析

目标网站 aHR0cHM6Ly93d3cuZW5kYXRhLmNvbS5jbi9pbmRleC5odG1s 一、抓包分析 响应数据加密 二、逆向分析 下断点&#xff0c;刷新页面 一直往下跟栈&#xff0c;发现是在这进行的加密 内部实现逻辑 本地数据获取 本文章仅提供技术分享交流学习&#xff0c;不可对目标服务器造…

OpenAI最新GPT-o1-preview测评

OpenAI最新GPT-o1-preview测评 测试之后感觉这个相对GPT4o&#xff0c;能力上升了一个大的台阶&#xff0c;思考能力极强的最强GPT模型 之前用GPT4o测试过类似的题目&#xff0c;做的效果极差&#xff0c;答案直接就是错&#xff0c;这次GPT-o1-preview居然做对了&#xff0c;逻…

Ethernet 系列(3)-- 物理层测试::IOP Test::Cable diagnostics

车载以太网物理层IOP测试&#xff0c;即互操作性测试&#xff08;Interop- erability Tests&#xff09;&#xff0c;用于验证车载以太网PHY&#xff08;通常也称为收发器&#xff09;的可靠性和检查PHY能否在给定的有限时间内建立稳定的链路;还用于车载以太网PHY的诊断&#x…

窗口函数性能提升50倍,PawSQL索引推荐实战案例

&#x1f31f;引言 在数据驱动的现代世界&#xff0c;SQL查询的速度是应用程序快速响应的关键。尤其是那些涉及窗口函数的复杂查询&#xff0c;若缺乏恰当的索引支持&#xff0c;性能瓶颈可能会成为阻碍。本文将带您看看PawSQL是如何通过智能索引推荐&#xff0c;帮助一个包含…

《深度学习》—— 神经网络中常用的激活函数

文章目录 1. Sigmoid 激活函数2. Softmax 激活函数3. ReLU 激活函数4. Leaky ReLU 激活函数5. ELU 激活函数6. Tanh 激活函数 激活函数&#xff08;Activation Function&#xff09;是在人工神经网络的神经元上运行的函数&#xff0c;负责将神经元的输入映射到输出端。它在神经…

CVE-2024-4956实战

一、访问网页 二、公司信息域名收集 三、抓包读取敏感文件 Burpsuite抓包&#xff0c;修改GET请求即可&#xff08;GET /%2F%2F%2F%2F%2F%2F%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd HTTP/1.1 &#xff09;

网工想提升,不止华为HCIE这一个证书

作为网络工程师&#xff0c;拥有一张HCIE&#xff08;华为认证互联网专家&#xff09;无疑是职业生涯中的一项重要成就&#xff0c;但网络技术的世界远比一张证书要复杂得多。提升自己的技术水平&#xff0c;不仅要依赖HCIE这一张证书&#xff0c;更可以通过学习其他认证&#…

现在的大模型榜单,真就没一个可信的,真的都是水分

现在的大模型榜单上&#xff0c;真的都是水分。 全是作弊的考生&#xff0c;真的。 上周&#xff0c;AI圈有个很炸裂的大模型发布&#xff0c;在全网引起了山呼海啸&#xff0c;一众从业者和媒体尊称它为开源新王。 就是Reflection 70B。 在每项基准测试上都超过了 GPT-4o&a…

printf 命令:格式化输出

一、命令简介 ​printf​ 命令在 Linux 系统中用于格式化并打印字符串到标准输出。它是 C 语言中 printf ​函数的命令行版本&#xff0c;因此其格式化选项与 C 语言中的非常相似。 相关命令&#xff1a; echo&#xff1a;通常使用 echo&#xff0c;它比较简单。printf&…

FastAPI开发环境搭建——开发第一个web程序

FastAPI开发环境搭建——开发第一个web程序 搭建开发环境 FastAPI官方文档学习 - FastAPI (tiangolo.com) 安装fastapi框架 pip install fastapi[all] pip install uvicorn使用对应IDE创建fastapi项目&#xff0c;例如pycharm,vscode和创建普通的python项目无差别 创建一个…

Solidity编码规范汇总篇

本文首发于公众号 【Keegan小钢】 上周&#xff0c;完成了 Solidity 编码规范的视频录制并上传到了 B 站、Youtube 和视频号。总共分为了 6 个小节&#xff0c;在 B 站的合集地址为&#xff1a; https://space.bilibili.com/60539794/channel/collectiondetail?sid3780183 为…

【ASE】第一课_双面着色器

今天我们一起来学习ASE插件&#xff0c;希望各位点个关注&#xff0c;一起跟随我的步伐 今天我们来学习双面着色器&#xff0c;对颜色和贴图进行差值&#xff0c;双面显示不同的效果 最终效果&#xff1a; 思路&#xff1a; 1.先确定前后面的贴图和颜色 贴图&#xff08;Alb…

高效工程师的七个习惯

原文 我曾与一些杰出的工程师共事过 – 在诸如 FAANG 的大公司&#xff0c;也在初创规模的小公司。他们让我看到&#xff0c;传说中的「10 倍」工程师&#xff0c;真实存在&#xff01; 如今&#xff0c;这些工程师中&#xff0c;有些人后来创办了自己的公司&#xff0c;他们…

kmp快速匹配

用处&#xff1a;对于一个较长的字符串A&#xff0c;判断A中是否存在字符串B。 思路&#xff1a; 暴力的做法是从A的每个元素开始&#xff0c;依次比较看是否有和B相同的子串&#xff0c;时间复杂度是o&#xff08;N*N&#xff09; 优化思路是对于每次查找完成以后&#xff…

springboot+vue宠物医院挂号看病诊断系统 f9h46

目录 宠物主人宠物医生系统管理人员系统实现截图技术介绍核心代码部分展示详细视频演示源码获取 宠物主人 登录注册&#xff1a;注册账户并登录系统。 首页&#xff1a;显示系统基本信息和用户导向功能。 个人中心&#xff1a;更新个人信息&#xff0c;包括联系方式、密码等。…

【AI创作组】工程方向的硕士研究生学习Matlab的路径

1. MATLAB软件概述 1.1 MATLAB发展历程 MATLAB自20世纪70年代诞生以来,已经经历了多次重要的版本更新和功能扩展。 初始版本:MATLAB的前身只是一个简单的交互式矩阵计算器,由Cleve B. Moler博士在1970年代初期开发,目的是为了方便学生和研究人员使用线性代数软件包LINPAC…

农业与植物基因组分析专家—优青博导提供从实验设计、数据分析到SCI论文咨询的一站式服务。多年经验,精准高效,为农业科研保驾护航!

&#x1f31f; 教授团队领衔&#xff0c;全方位服务&#xff01; &#x1f680; 从实验设计到论文发表&#xff0c;一站式解决方案&#xff01; &#x1f4c8; 选择我们&#xff0c;加速您的科研进程&#xff0c;让成果不再等待&#xff01; &#x1f4dd; 专业分析 定制服…

ubuntu安装gitlab-runner

目录 1.添加gitlab 仓库地址 ​编辑2. 安装gitlab-runner命令 1.添加gitlab 仓库地址 curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash2. 安装gitlab-runner命令 sudo apt-get install -y gitlab-ru…