[动态规划] (十) 路径问题 LeetCode 174.地下城游戏

[动态规划] (十) 路径问题: LeetCode 174.地下城游戏

文章目录

      • [动态规划] (十) 路径问题: LeetCode 174.地下城游戏
        • 题目解析
        • 解题思路
          • 状态表示
          • 状态转移方程
          • 初始化和填表顺序
          • 返回值
        • 代码实现
        • 总结

174. 地下城游戏

image-20231106211654025

题目解析

先明白下题题再来看。

[动态规划] (四) LeetCode 91.解码方法-CSDN博客

(1) 骑士拯救公主:从左上角到右下角

(2) 每个格子都是一个房间,房间内有恶魔或者魔法球

(3) 恶魔扣除血量,魔法球增加血量

(4) 骑士只能向右或者向下移动

(5) 血量小于等于0,骑士死亡

(6) 返回拯救公主,最少需要的血量

解题思路
状态表示

按照以往的经验,我们都是设定以(i,j)位置为终点所需要的最低血量,但是这道题不太方便。

示例1:dungeon = [[-2,-3,3],[-5,-10,1],[10,30,-5]]

image-20231106212350023

假如一开始,你设定最小血量为3。

  • 第一次,3 - 2 => 1-3 => -2,又得回去修改初始血量为6,
  • 第二次,6-2-3=> 1+3+1=>5-5 = 0,又回去设定初始血量为7,
  • 第三次,7-2-3+3+1 => 6-5=>1 ,终于救出了公主。

这种情况有个专业的名词,后置性。(想要了解大家可以去自行查资料)

总之,这种方法很难实现,所以我们选择第二种方法。

以(i,j)为起点到达终点所需要的最低血量,即dp[i] [j]。

状态转移方程

从(i,j)位置到下一步,也就是到达(i,j+1)或者(i+1,j)位置。

所以到达(i,j)位置后加上当前位置的值dungeon(i,,j),必须大于等于下一位置的值。

即骑士到达(i,j)位置,击败(i,j)位置上的恶魔后,血量必须大于击败下一个恶魔所消耗的血量。也就是如上图,骑士击败-2位置的恶魔后的血量,必须大于-3,也就是等于6。

dp[i][j] + dungeon[i][j] >= min(dp[i][j+1], dp[i+1][j])

当然,房间内也有可能是魔法球(加血),到达dp[i] [j]前有可能血量已经小于等于0了,我们必须让它的最小值是1即可。

即骑士到达(i,j)位置,获得(i,j)位置上的魔法球前血量必须最小为1。

如上图,骑士接连击败-2,-3恶魔后还得有1滴血来获得魔法球。

为了不让dp[i] [j]为负数,

dp[i][j] = max(1, dp[i][j])
初始化和填表顺序
  • 初始化

我们访问的是j+1、i+1的位置,所以一般从右下角开始初始化。

和以往不同,我们初始化时,与1-6号位置有边界情况,如图。

image-20231106215416785

1号位置与右边和下边的位置有影响,让它初始化为1,即可保证击败公主位置上的恶魔后至少还有1滴血。

2、3、4、5、6等位置的下边或者旁边,因为多了一行或者一列,为了不让骑士走出恶魔的城堡,初始化为整数的最大值即可。

  • 填表顺序

倒着一列一列填表即可,参考状态表示,一步一步推出上一位置所需要的最少血量,直到(0,0)位置。

返回值

返回(0,0)位置即可,与我们得出的状态表示相同。

看到这里,大家可以尝试实现一下代码,然后再看后面的内容。


代码实现
class Solution {
public:int calculateMinimumHP(vector<vector<int>>& dungeon) {//创建一个dp数组int m = dungeon.size(), n = dungeon[0].size();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][j+1], dp[i+1][j]) - dungeon[i][j];dp[i][j] = max(1, dp[i][j]);}//返回值return dp[0][0];}
};

image-20231106220136713

总结

细节1:我们的下标对应的原数组并没有因为我们扩大一列和一行而改变,因为我们扩大的是最后一列最后一行。

细节2:走到下一位置时至少还要保证有1滴血,若是血量 <= 0,让它至少要为1滴血,否则无法进入下一个房间。

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

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

相关文章

网络编程套接字(2)——简单的TCP网络程序

文章目录 一.简单的TCP网络程序1.服务端创建套接字2.服务端绑定3.服务端监听4.服务端获取连接5.服务端处理请求6.客户端创建套接字7.客户端连接服务器8.客户端发起请求9.服务器测试10.单执行流服务器的弊端 二.多进程版的TCP网络程序1.捕捉SIGCHLD信号2.让孙子进程提供服务 三.…

3D人像手办定制业务再掀热潮,这一次有怎样的革新?(方法篇)

最近&#xff0c;3D真人手办热潮再起&#xff0c;最出圈的一次当属亚运会的3D打印元宇宙体验舱里面各国运动员带火的真人手办定制项目。作为3D技术推广者&#xff0c;博雅仔也在后台接受了很多朋友的询问—— ◆ 技术已经成熟了吗&#xff1f; ◆ 个人定做3D真人手办市场价格…

superset study day01 (本地启动superset项目)

文章目录 什么是superset?superset文档 superset开发环境搭建superset后端环境1. 新建数据库2. 环境配置3. 修改py文件4. 迁移数据库5. 启动项目 superset 前端代码打包搭建完成,效果页面 什么是superset? Apache Superset™ 是一个开源的现代数据探索和可视化平台。 Super…

基于鹈鹕算法的无人机航迹规划-附代码

基于鹈鹕算法的无人机航迹规划 文章目录 基于鹈鹕算法的无人机航迹规划1.鹈鹕搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鹈鹕算法来优化无人机航迹规划。 1.鹈鹕搜索算法 …

基于STC15单片机温度光照蓝牙传输-proteus仿真-源程序

一、系统方案 本设计采用STC15单片机作为主控器&#xff0c;液晶1602显示&#xff0c;DS18B20采集温度&#xff0c;光敏电阻采集光照、按键设置温度上下限&#xff0c;测量温度小于下限&#xff0c;启动加热&#xff0c;测量温度大于上限&#xff0c;启动降温。 二、硬件设计 …

网络工程师回顾学习

根据书本目录&#xff0c;写下需要记忆的地方&#xff1a; 参考之前的笔记&#xff1a; 网络工程师回答问题_one day321的博客-CSDN博客 重构第一部分需要记忆的&#xff1a; 第一章&#xff1a;计算机网络概论 计算机网络的定义和分类&#xff1a;计算机网络是指将地理位…

YOLOv8改进之更换BiFPN并融合P2小目标检测层

目录 1. BiFPN 1.1 FPN的演进 2. YOLOv8改进之更换BiFPN并融合P2小目标检测层 1. BiFPN BiFPN&#xff08;Bi-directional Feature Pyramid Network&#xff09;是一种用于目标检测和语义分割任务的神经网络架构&#xff0c;旨在改善特征金字塔网络&#xff08;Feature Pyram…

Java——》4种引用:强软弱虚

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

自动驾驶高效预训练--降低落地成本的新思路(AD-PT)

自动驾驶高效预训练--降低落地成本的新思路 1. 之前的方法2. 主要工作——面向自动驾驶的点云预训练2.1. 数据准备 出发点&#xff1a;通过预训练的方式&#xff0c;可以利用大量无标注数据进一步提升3D检测 https://arxiv.org/pdf/2306.00612.pdf 1. 之前的方法 1.基于对比学…

手工测试1年经验面试,张口要18K,我真是服了····

由于朋友临时有事&#xff0c; 所以今天我代替朋友进行一次面试&#xff0c;他需要应聘一个测试工程师&#xff0c; 我以很认真负责的态度完成这个过程&#xff0c; 大概近30分钟。 主要是技术面试&#xff0c; 在近30分钟内&#xff0c; 我与被面试者是以交流学习的方式进行的…

未来商业趋势:无人奶柜的无限潜力

未来商业趋势&#xff1a;无人奶柜的无限潜力 随着自动售货机的普及和公共场所需求的多样化&#xff0c;无人奶柜作为一种新兴的自动售货机&#xff0c;开始出现在学校、医院、办公楼、商场等公共场所&#xff0c;为人们提供便捷、低成本的饮品购买服务。 这种无人奶柜不仅可以…

Java 高效生成按指定间隔连续递增的列表(int,double)

简介 Java 按照指定间隔生成连续递增的List 列表&#xff08;引入Stream 类和流操作来提高效率&#xff09;&#xff1a; 1. 生成递增的List< Integer> Testpublic void test009(){int start 1;int interval 2;int count 10;List<Integer> list IntStream.ite…

044_第三代软件开发-保存PDF

第三代软件开发-保存PDF 文章目录 第三代软件开发-保存PDF项目介绍保存PDF头文件源文件使用 关键字&#xff1a; Qt、 Qml、 pdf、 painter、 打印 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language&#xff…

10 特征向量与特征值

特征向量与特征值 什么是特征向量三维空间的旋转矩阵和线性变换特征向量二维线性变换不一定有特征向量一个特征值可能不止一个特征向量特征基 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 图1 预备知识 什么是特征向量 图1 特征向量 线性变换过程中&#xff…

领跑中国APM市场,博睿数据蝉联第一!

近日&#xff0c;全球领先的IT市场研究和咨询公司IDC发布《中国IT统一运维软件产品市场跟踪报告&#xff0c;2023H1》&#xff0c;报告显示&#xff0c;博睿数据以市场份额20.14%再创新高&#xff0c;蝉联APM市场第一。 2023年上半年&#xff0c;APM市场呈现同比增长的趋势。在…

顺丰函证通API集成,无代码开发连接CRM和电商平台

1. 顺丰&#xff1a;全球第四大快递公司的无代码开发连接 顺丰是全球第四大快递公司&#xff0c;秉承 “以用户为中心&#xff0c;以需求为导向&#xff0c;以体验为根本” 的产品设计思维。顺丰不仅在国内市场深耕&#xff0c;而且横向拓展多元业务领域&#xff0c;纵深完善产…

灵魂拷问:读取 excel 测试数据真的慢吗?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

非农数据不及预期,美元回落金价触及2000关口

上周五美国非农数据公布&#xff0c;现货黄金短线拉升近16美元&#xff0c;金价突破2000关口最高至2003.55美元/盎司&#xff0c;但随后金价转头回落&#xff0c;最终报收1992.19美元/盎司&#xff0c;涨幅收窄至0.34%。周线级别金价下跌0.61%&#xff0c;金价终止之前连续三周…

基于ssm+jsp背单词系统的设计与实现

ssm背单词系统&#xff0c;java记单词系统&#xff0c;背单词系统 运行环境&#xff1a; JAVA版本&#xff1a;JDK1.8 IDE类型&#xff1a;IDEA、Eclipse都可运行 数据库类型&#xff1a;MySql&#xff08;8.x版本都可&#xff09; 硬件环境&#xff1a;Windows 角色&#xff…

[BUUCTF NewStar 2023] week5 Crypto/pwn

最后一周几个有难度的题 Crypto last_signin 也是个板子题&#xff0c;不过有些人存的板子没到&#xff0c;所以感觉有难度&#xff0c;毕竟这板子也不是咱自己能写出来的。 给了部分p, p是1024位给了922-101位差两头。 from Crypto.Util.number import * flag b?e 655…