leetcode:174. 地下城游戏:动态规划法

news2024/9/23 11:19:08

174. 地下城游戏 - 力扣(Leetcode)

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。

骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

为了尽快解救公主,骑士决定每次只 向右 或 向下 移动一步。

返回确保骑士能够拯救到公主所需的最低初始健康点数。

注意:任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。

动态规划:

审题:

我们需要X体力值从左上角到左下角的体力至少需要多少体力值,其实变相的是考验我们对最短路径的思考,并且在这条路径开始到结束过程中不可为0或小于0,这就需要我们需要知道出发前最少需要多少健康值,才可以保证在运动时,不被杀死。
算法原理:

状态表示:

1:如果以dp[i][j]为结尾时。

如果以dp[i][j]为结尾时,从起点出发->到[i][j]我们不仅需要知道之前最少需要的健康值,而且还需知道之后的健康值,我们无法初始化第一次循环所需要的数据。

2:如果以dp[i][j]为开始(根据该状态表示)

如果以dp[i][j]为开始,我们只需要知道dp[i][j+1]与dp[i+1][j]的最少需要健康值就可迭代,因为我们知道,骑士到右下角后需要击败怪物并且活下来,所以如果我们直接在起始点就是右下角,骑士就只需要一次击败怪物并且活下来(至少剩一个点数),所以我们只需要保证当出去以后最低健康值为1即可。

状态转移方程

我们将怪物也看成回血,只是反向回血。

但是有一个注意点,假设dungeon[i][j]非常的大,大过了dp[i][j+1]那么此刻dp[i][j]成为了负数,回到不等公式,

X+dungeon[i][j] >=dp[i][j+1]; 说明了还没加dungeon[i][j]前的血量为负数,这是不允许的,最少得是1的最低生命值,所以在每次方程结束后我们都需要判断dp[i][j]是否>=1,如果小于则等于1,否则不变。

初始化

我们从表的右下角开始遍历,由于我们需要[i+1][j]与[i][j+1]的数据,所以特殊的位置的数据遍历会造成越界访问

所以我们创建的dp表需要比形参表行列多一行,多一列。

我们的第一个dp数据为右下角数据,我们需要保证骑士的健康值从-5出去以后的最低健康值为1;

 由于蓝圈为第一次的[i][j]填写数据,所以我们需要初始化它的右位置与下位置,而蓝圈为骑士最后战斗的地方,所以最后只需要1格的生命值离开蓝圈,所以初始化这两个位置的dp值为1.

填表顺序

从右到左,从下到上

返回值

dp[0][0]//  min(dp[0][1],dp[1][0])-dungeon[0][0]。

代码

    int calculateMinimumHP(vector<vector<int>>& dungeon) {
        if(dungeon.size()==0)//如果数据为空,1点生命值足以
        {
            return 1;
        }
        int n=dungeon.size(),m=dungeon[0].size(); 
        vector<vector<int>> dp(n+1,vector<int>(m+1,INT_MAX));//创建dp表
        dp[n][m-1]=dp[n-1][m]=1;//初始化
        for(int i=n-1;i>=0;--i)//从下往上
        {
            for(int j=m-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];//返回最顶开始到低的最低值
    }

 

 

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

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

相关文章

史上最全Windows下VScode配置大全

文章目录 1、安装Vscode下载安装配置C和中文 2、安装MinGW-w643、检查是否配置成功 1、安装Vscode 下载安装 首先先下载VSCODE&#xff1a; 链接: VScode下载 下载好安装包以后&#xff0c;直接在自己指定目录安装&#xff1a; 配置C和中文 打开VScode的左下角位置&#…

Proteus 8.13安装教程

不涉及版权问题。 1、双击“Proteus 8.13 SP0 Pro.exe”开始安装 2、按照安装向导进行操作&#xff0c;等待安装成功 1&#xff09;选择“Browse"自定义安装路径&#xff0c;再点击&#xff1a;Next 2&#xff09;点击&#xff1a;Next 3&#xff09;等待一段时间&#xf…

C#学习之路-判断

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 下面是大多数编程语言中典型的判断结构的一般形式&#xff1a; 判断语句 语句描述if …

闪烁灯光门铃电路设计

闪烁灯光门铃不仅具有门铃的声音还可以通过家里的门灯发出闪烁的灯光&#xff0c;适合用于室内嘈杂环境时使用&#xff0c;也适用于有聋哑人的家庭。 一、电路工作原理 电路原理如图 30 所示。 由基本的门铃电路和灯光、声音延迟控制电路两部分组成。按下门铃按钮 SB&#x…

C语言每日一题之旋转数求最小值

hello&#xff0c;今天我们分享一道题目&#xff0c;是牛客网上的一道题 求旋转数组中的最小值https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId13&tqId23269&ru/ta/coding-interviews&qru/ta/coding-interviews/question-ranking 那我…

创新指南 | 用这8种商业分析模型,让你得到靠谱的业务创新灵感

当我们想要创新时&#xff0c;往往需要有实际的依据来支撑我们的想法。商业咨询顾问通常被认为是聪明的人&#xff0c;他们拥有模型化的分析思维&#xff0c;这种思维方式可以帮助他们更好地理解市场、竞争对手和客户需求。商业分析思维是一种系统性的思考方式&#xff0c;它可…

P1 第一章 电路模型与电路定律

1、什么是电路模型&#xff1f; 实际电路与电路模型间的关系&#xff1f;建立在相同的电路理论基础之上。 实际电路定义&#xff1a;由电工设备和电气器件&#xff0c;按照预期目的连接构成的&#xff0c;电流的通路。 实际电路的功能&#xff1a;能量方面&#xff0c;可以传输…

【计算机网络】第三章 数据链路层(MAC地址 IP地址 ARP协议)

文章目录 3.7.1 MAC地址3.7.2 IP地址3.7.3 ARP协议 3.7.1 MAC地址 MAC地址&#xff08;Media Access Control address&#xff09;是网络设备&#xff08;如网卡、无线网卡&#xff09;在数据链路层上的唯一标识符。以下是有关MAC地址的一些要点&#xff1a; 描述&#xff1a…

超详细,Jmeter性能测试-模拟100个用户并发(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 100个真实的用户 …

【uniapp调用微信支付】uniapp开发小程序-调用微信支付

哈喽大家好~我是马小跳。一名进阶中的程序媛。 在这里记录下自己成长的每一次进步&#xff0c;希望遇到志同道合的猿友 一起努力&#xff0c;一起把技术up up up&#xff01;&#xff01;&#xff01; 使用uniapp开发小程序时&#xff0c;调用微信支付的步骤如下&#xff1a; …

Web项目中耗时操作,用异步请求,减少请求等待时间,使用Redis保证操作幂等性

最近项目中碰到了一个接口需要比较耗时的操作&#xff0c;但是我们公司前后端交互的网关设置了超时时间。因此我需要设置出一个方案保证给用户比较快的响应&#xff0c;又保证任务执行了。因此我采用了&#xff0c;下面的操作方式。 客户端发送请求后&#xff0c;我会先去Redis…

MySQL数据库,创建表及其插入数据和查询数据

首先&#xff0c;由上图创建表 mysql> create table worker(-> dept_id int(11) not null,-> emp_id int (11) not null,-> work_time date not null,-> salary float(8,2) not null,-> poli_face varchar(10) not null default 群众,-> name varchar(20…

中文模型的奋起直追:MOSS、baichuan-7B和ChatGLM2-6B的原理、部署与微调

第一部分 复旦MOSS MOSS是复旦大学邱锡鹏团队推出的一个支持中英双语和多种插件的开源对话语言模型&#xff0c;moss-moon系列模型具有160亿参数&#xff0c;在FP16精度下可在单张A100/A800或两张3090显卡运行&#xff0c;在INT4/8精度下可在单张3090显卡运行 其基座语言模型…

【React笔记】react循环列表的写法

react循环的写法 简单循环输出人名简单循环输出json格式数组 简单循环输出人名 循环输出people数组中的四个人名 import ReactDOM from react-dom/client;const people [宋江,卢俊义,吴用,公孙胜 ]; const root ReactDOM.createRoot(document.getElementById(root)); root.…

深度学习入门知识总结

0、前言&#xff1a;学习了深度学习入门的鱼书&#xff0c;很多基础概念有了大概了解&#xff0c;及时总结&#xff0c;方便日后查找 1、神经网络&#xff08;深度学习&#xff09;的起源算法——感知机&#xff1a; 定义&#xff1a;感知机接收多个输入信号&#xff0c;输出一…

【C++修炼之路】33.特殊类设计

每一个不曾起舞的日子都是对生命的辜负 特殊类设计 一.设计一个类&#xff0c;不能被拷贝二.设计一个类&#xff0c;只能在堆上创建对象1. 普通类的创建对象2.只能在堆上创建对象的类 三.设计一个类&#xff0c;只能在栈上创建对象四.设计一个类&#xff0c;不能被继承五.单例模…

Flink使用总结

本文主要是为Flink的java客户端使用和flink-sql使用的大致介绍&#xff0c;具体使用查看文档页面。 java client使用 文档 Apache Flink Documentation | Apache Flink 数据处理模型 maven依赖 <?xml version"1.0" encoding"UTF-8"?> <pro…

【YOLOv8-Seg】实战二:LabVIEW+OpenVINO加速YOLOv8-seg实例分割

‍‍&#x1f3e1;博客主页&#xff1a; virobotics的CSDN博客&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『LabVIEW深度学习实战』 &#x1f37b;上期文章&#xff1a; 【YOLOv8-seg】实战一&#xff1a;手把手教你使用YOLOv8实现实例分割 …

【数据分析 - 基础入门之NumPy⑥】- NumPy案例巩固强化

文章目录 前言一、NumPy基础训练1.1 创建一个长度为10的一维全为0的ndarray对象&#xff0c;并让第5个元素为11.2 创建一个元素为从10到49的ndarray对象1.3 将第2题的所有元素位置反转1.4 创建一个10*10的ndarray对象并打印最大最小元素1.5 创建一个10*10的ndarray对象&#xf…

程序设计相关概念

计算机概念 计算机是根据指令操作数据的设备。具有功能性和可编程性的特点。 功能性&#xff1a;对数据的操作&#xff0c;表现为数据计算、输入输出处理和结果存储等。 可编程性&#xff1a;根据一系列指令自动地、可预测地、准确地完成操作者的意图。 计算机的发展 计算机…