当前位置: 首页 > news >正文

详解LeetCode地下城游戏(动态规划)——区分两种状态表示形式

地下城游戏

题目链接:174. 地下城游戏

状态表示:
按照以往题的表示,dp[i][j]表示:从起点(0,0)位置到达(i,j)位置时,所需的最小初始健康值。但是如果这么去表示,不仅要考虑到达(i,j)位置的最小初始健康值,由于魔法球的存在,还需要考虑到达(i,j)位置时的健康值,因为魔法球会对算后续位置的最小初始健康值产生影响

下面用题目中的示例1为例,演示:
在这里插入图片描述
由此可知,到达魔法球位置所需的最低初始健康值和上一次的最低初始健康值保持一致,而魔法球会增加健康值,这就会对后面的结果产生影响,因此我们不仅要考虑到达(i,j)位置的最小初始健康值,还需要考虑到达(i,j)位置时的健康值,以保证后续结果的正确性

因此,我们可以试着用dp[i][j]表示:以(i,j)位置为起点,到达终点位置时,所需的最小健康值。当(i,j)位置是魔法球时,可以用之前的dp[i+1][j]和dp[i][j+1]中的最小健康值减去治疗量,就能得到当前的位置到达终点位置时所需的最小健康值dp[i][j](注意:dp[i][j]不能小于0,最小值为1);当(i,j)位置是恶魔时,也是这样处理,实际上就是加上了需要扣除的健康值
在这里插入图片描述
通过这种状态表示,我们最终能够求得结果!

总结:

  1. 这道题的难点在于怎么去处理健康值增加的问题,健康值的增加不能为之前的损失提供帮助,只会对后续有帮助
  2. 如果按照第一种状态表示,dp[i][j]仅仅只表示了从(0,0)位置到达(i,j)位置所需的最小初始健康值,而由于魔法球的存在,导致后续的健康值会增加,因此我们还需要去记录当前位置的健康值,以保证后续计算最小初始健康值的正确性
  3. 如果按照第二种状态表示,dp[i][j]表示从(0,0)位置出发,按照最优路径到达(i,j)位置时,还需要剩余的最小健康值(为了到达终点后,健康值为1)。即dp[i][j]不仅表示了从(i,j)位置到达终点位置所需的最小初始健康值,还表示了从(0,0)位置出发到达(i,j)位置时,所需剩余的最小健康值(即当前健康值)
  4. 比较两种状态表示,可知,第二种表示更合理,更方便后续的填表

状态转移方程
dp[i][j] = min(dp[i+1][j],dp[i][j+1])-d[i][j],dp[i][j] = max(1, dp[i][j])

初始化
创建表时,多创建一行(第m行)和一列(第n列),除dp[m][n-1] = 1(dp[m-1][n] 也可初始化为1,表示救出公主后还需剩余1点健康值),其他都初始化为正无穷(以防对填表产生影响)

填表顺序
从下往上,每一行从右往左

返回值
dp[0][0]

实现代码

class Solution {public int calculateMinimumHP(int[][] dungeon) {//1.创建dp表int m = dungeon.length;int n = dungeon[0].length;int[][] dp = new int[m+1][n+1];//2.初始化for(int row = 0; row < m+1; row++) {dp[row][n] = Integer.MAX_VALUE;}for(int col = 0; col < n+1; col++) {dp[m][col] = Integer.MAX_VALUE;}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] = Math.min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j];dp[i][j] = Math.max(1, dp[i][j]);}}//4.返回值return dp[0][0];}
}

相关文章:

详解LeetCode地下城游戏(动态规划)——区分两种状态表示形式

地下城游戏 题目链接&#xff1a;174. 地下城游戏 状态表示&#xff1a; 按照以往题的表示&#xff0c;dp[i][j]表示&#xff1a;从起点&#xff08;0&#xff0c;0&#xff09;位置到达&#xff08;i&#xff0c;j&#xff09;位置时&#xff0c;所需的最小初始健康值。但是…...

.NET正则表达式

正则表达式提供了功能强大、灵活而又高效的方法来处理文本。 正则表达式丰富的泛模式匹配表示法使你可以快速分析大量文本&#xff0c;以便&#xff1a; 查找特定字符模式。 验证文本以确保它匹配预定义模式&#xff08;如电子邮件地址&#xff09;。 提取、编辑、替换或删除…...

k8s 为什么需要Pod?

Pod&#xff0c;是 Kubernetes 项目中最小的 API 对象&#xff0c;更加专业的说&#xff0c;Pod&#xff0c;是 Kubernetes 项目的原子调度单位。 Pod 是 Kubernetes 里的原子调度单位。这就意味着&#xff0c;Kubernetes 项目的调度器&#xff0c;是统一按照 Pod 而非容器的资…...

CV(3)--噪声滤波和特征

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 图像噪声&#xff08;需要主动干扰的场景&#xff09;&#xff1a; 添加高斯噪声&#xff1a;概率密度函数服从高斯分布的一类噪声 通过设置sigma和mean生成符合高斯分布的随机数&#xff0c;然后计算输出像素&#xff0c;放缩…...

LDR6500:音频双C支持,数字与模拟的完美结合

在当今数字化快速发展的时代&#xff0c;音频设备的兼容性和性能成为了用户关注的重点。LDR6500&#xff0c;作为乐得瑞科技精心研发的USB Power Delivery&#xff08;PD&#xff09;协议芯片&#xff0c;凭借其卓越的性能和广泛的应用兼容性&#xff0c;为音频设备领域带来了新…...

python web app开发

背景: web app VS 本地GUI开发 web app开发以来一直被人诟病性能,无法访问本地设备,无状态的等缺点而被迫转向本地GUI开发;但本地开发如C++ QT,MFC,WinForm等开发结构又太重,使人望而生畏。web app有个有点就…...

redis数据结构和内部编码及单线程架构

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. 数据结构和内部编码 Redis会在合适的场景选择合适的内部编码 我们可以通过objectencoding命令查询内部编码 : 2. 单线程架构 …...

【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code&#xff0c;并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号]&#xff0c;2、在Visual Studio Code扩展中搜索Unity&#xff0c;并安装3、同时注意这个插件下面的描述&#xff0c;需要根…...

AI大模型学习笔记|人工智能的发展历程、智能体的发展、机器学习与深度学习的基本理论

学习链接&#xff1a;冒死上传&#xff01;价值2W的大模型入门到就业教程分享给大家&#xff01;轻松打造专属大模型助手&#xff0c;—多模态、Agent、LangChain、ViT、NLP_哔哩哔哩_bilibili 百度网盘自己整理的笔记&#xff1a; 通过网盘分享的文件&#xff1a;1-人工智能的…...

C#实现一个HttpClient集成通义千问-多轮对话功能实现

多轮对话功能实现 视频教程实现原理消息的类型 功能开发消息类修改请求体修改发送请求函数修改用户消息输入 多轮对话的token消息完整文档消息类型 视频教程 .NetAI开发入门HttpClient实现通义千问集成-多轮对话功能实现 实现原理 一直保留更新messages 现在设置的meessages只…...

Java Web 7 请求响应(Postman)

前言&#xff08;SpringBoot程序请求响应流程&#xff09; 以上一章的程序为例&#xff0c;一个基于SpringBoot的方式开发一个web应用&#xff0c;浏览器发起请求 /hello 后 &#xff0c;给浏览器返回字符串 “Hello World ~”。 而我们在开发web程序时呢&#xff0c;定义了一…...

Android APP自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 Android导入已有外部数据库 2015.06.26在QQ空间记录&#xff1a;在Android中不能直接打开res aw目录中的数据…...

Linux 系统报打开的文件过多

1.问题 1804012290 [reactor-http-epoll-1] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. - io.nett…...

javaWeb之过滤器(Filter)

目录 前言 过滤器概述 什么是过滤器 过滤器详细 过滤器的生命周期 过滤器的应用 创建一个简单的Filter类步骤 注意&#xff1a;指定拦截路径&#xff0c;我们有两种方式 实例 前言 本篇博客的核心 知道过滤器的整个拦截过程知道如何指定拦截路径知道过滤器的生命周期…...

ModStartBlog v10.0.0 发布时间自定义,多图快速粘贴,博客编辑器升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …...

Unexpected token ‘<‘, “<!doctype “... is not valid JSON

Unexpected token ‘<’, "<!doctype "… is not valid JSON 在前端开发时&#xff0c;遇到以下报错内容。 1.报错内容如下&#xff1a; // 报错内容 Uncaught (in promise) SyntaxError: Unexpected token <, "<!doctype "... is not valid…...

24/12/9 算法笔记<强化学习> PPO,DPPO

PPO是目前非常流行的增强学习算法&#xff0c;OpenAI把PPO作为目前baseline算法&#xff0c;首选PPO&#xff0c;可想而知&#xff0c;PPO可能不是最强的&#xff0c;但是是最广泛的。 PPO是基于AC架构&#xff0c;因为AC架构有一个好处&#xff0c;就是解决了连续动作空间的问…...

Linux下编译安装METIS

本文记录Linux下编译安装METIS的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1 一、安装依赖 1.1 下载GKlib sudo apt-get install build-essential sudo apt-get install cmake 2.2 编译安装GKlib 下载GKlib代码&#xff0c; …...

【数据库】关系代数和SQL语句

一 对于教学数据库的三个基本表 学生S(S#,SNAME,AGE,SEX) 学习SC(S#,C#,GRADE) 课程(C#,CNAME,TEACHER) &#xff08;1&#xff09;试用关系代数表达式和SQL语句表示&#xff1a;检索WANG同学不学的课程号 select C# from C where C# not in(select C# from SCwhere S# in…...

amazon亚马逊滑动识别验证码

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/15 亚马逊的滑动还原验证码数据集如下: 和某顶象的差不多,图片分割高度是中间固定的,…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...