Leetcode.174 地下城游戏

news2025/1/4 17:46:28

题目链接

Leetcode.174 地下城游戏 hard

题目描述

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

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

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

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

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

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

示例 1:

在这里插入图片描述

输入:dungeon = [[-2,-3,3],[-5,-10,1],[10,30,-5]]
输出:7
解释:如果骑士遵循最佳路径:右 -> 右 -> 下 -> 下 ,则骑士的初始健康点数至少为 7 。

示例 2:

输入:dungeon = [[0]]
输出:1

提示:

  • m = d u n g e o n . l e n g t h m = dungeon.length m=dungeon.length
  • n = d u n g e o n [ i ] . l e n g t h n = dungeon[i].length n=dungeon[i].length
  • 1 ≤ m , n ≤ 200 1 \leq m, n \leq 200 1m,n200
  • − 1000 ≤ d u n g e o n [ i ] [ j ] ≤ 1000 -1000 \leq dungeon[i][j] \leq 1000 1000dungeon[i][j]1000

解法:动态规划

假设我们考虑从左上角到右下角,这样的话我们需要考虑两个因素:当前路径和当前路径上的最小路径和。因为存在两个同等重要的因素,所以我们无法确定下一个位置。

既然从左上角到右下角不行,那么我们就考虑从右下角到左上角。

考虑从右下角到左上角,我们定义 f ( i , j ) f(i,j) f(i,j) 为从位置 ( i , j ) (i,j) (i,j) 到终点 ( m − 1 , n − 1 ) (m-1,n-1) (m1,n1)所需要的最低初始健康点数。按照定义,最终我们返回的结果就是 f ( 0 , 0 ) f(0,0) f(0,0)

f ( i , j ) f(i,j) f(i,j) 只与 f ( i + 1 , j ) f(i + 1,j) f(i+1,j) f ( i , j + 1 ) f(i,j+1) f(i,j+1) 以及 d u n g e o n [ i ] [ j ] dungeon[i][j] dungeon[i][j] 有关。

f ( i , j ) = m i n { f [ i + 1 ] [ j ] , f [ i ] [ j + 1 ] } − d u n g e o n [ i ] [ j ] f(i,j) = min \{ f[i + 1][j] , f[i][j + 1] \} - dungeon[i][j] f(i,j)=min{f[i+1][j],f[i][j+1]}dungeon[i][j]

因为 f [ i ] [ j ] f[i][j] f[i][j] 必须是 ≥ 1 \geq1 1 的,所以最终的转移方程为:

f ( i , j ) = m a x { m i n ( f [ i + 1 ] [ j ] , f [ i ] [ j + 1 ] ) − d u n g e o n [ i ] [ j ] , 1 } f(i,j) = max \{ min ( f[i + 1][j] , f[i][j + 1] ) - dungeon[i][j],1\} f(i,j)=max{min(f[i+1][j],f[i][j+1])dungeon[i][j],1}

i = m − 1 i =m - 1 i=m1 或者 j = n − 1 j = n- 1 j=n1时, f [ i + 1 ] [ j ] f[i+1][j] f[i+1][j] f [ i ] [ j + 1 ] f[i][j+1] f[i][j+1] 就会分别越界。初始直接定义 f [ i ] [ j ] f[i][j] f[i][j] 为一个较大的值,这里我设置的是 1 0 9 10^9 109

特别需要注意的是,我们直接把 f [ m ] [ n − 1 ] f[m][n-1] f[m][n1] f [ m − 1 ] [ n ] f[m-1][n] f[m1][n] 设置为 1 1 1,这样是为了让 f [ m − 1 ] [ n − 1 ] = d u n g e o n [ m − 1 ] [ n − 1 ] f[m-1][n-1] = dungeon[m-1][n-1] f[m1][n1]=dungeon[m1][n1]

时间复杂度: O ( m × n ) O(m \times n) O(m×n)

C++代码:

class Solution {
public:
    int calculateMinimumHP(vector<vector<int>>& g) {
        int m = g.size() , n = g[0].size();
        vector<vector<int>> f(m + 1,vector<int>(n + 1,1e9));

        f[m][n - 1] = 1;
        f[m - 1][n] = 1;

        for(int i = m - 1;i >= 0;i--){
            for(int j = n - 1;j >= 0;j--){
                int t = min(f[i + 1][j],f[i][j + 1]);
                f[i][j] = max(t - g[i][j] , 1);
            }
        }

        return f[0][0];
    }
};

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

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

相关文章

【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka

作者简介 前言 博主之前写过一个完整的MQ系列&#xff0c;包含RabbitMQ、RocketMQ、Kafka&#xff0c;从安装使用到底层机制、原理。专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12142400.html?spm1001.2014.3001.5482 本文是该系列的清单综述&#xf…

ChatGPT集锦

目录 1. 一条指令让ChatGPT变的更强大2. 对ChatGPT提问时,常见的10种错误描述3. Custom instructions如何设置1. 一条指令让ChatGPT变的更强大 在使用GPT的过程中,如何让AI更清晰地了解你的需求很重要?今天分享一个指令,可以让GPT成为你的好同事,与你一起分析和解决问题,…

MySQL数据库进阶实战:优化性能、提高安全性和实现高可用性

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 当涉及到MySQL数据库的进…

【2023年11月第四版教材】第10章《进度管理》(合集篇)

第10章《进度管理》&#xff08;合集篇&#xff09; 1 章节说明2 管理基础3 管理过程3.1 管理的过程★★★3.2 管理ITTO汇总★★★ 4 规划进度管理4.1 进度管理计划★★★5 定义活动5.1 滚动式规划★★★5.2 里程碑清单★★★ 6 排列活动顺序6.1 紧前关系绘图法★★★6.2 箭线图…

SpringMVC(一)

1.SpringMVC简介 1.1 什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M:Model,模型层&#xff0c;指工程中的JavaBean,作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean:专门存储业务逻辑的&#xff0c;如Student、Us…

mybatisplus多租户原理略解

概述 当前mybatisPlus版本 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.2</version> </dependency>jdk版本&#xff1a;17 springboot版本&#xff1a;…

高速路自动驾驶功能HWP功能定义

一、功能定义 高速路自动驾驶功能HWP是指在一般畅通高速公路或城市快速路上驾驶员可以放开双手双脚&#xff0c;同时注意力可在较长时间内从驾驶环境中转移&#xff0c;做一些诸如看手机、接电话、看风景等活动&#xff0c;该系统最低工作速度为60kph。 如上两种不同环境和速度…

判断数据类型是否为时间区间pd.api.types.is_period_dtype()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断数据类型 是否为时间区间 pd.api.types.is_period_dtype() 选择题 下列说法错误的是? import pandas as pd a pd.Series(pd.period_range(2023-01-01, periods3)) print(【显示】a) p…

【Two Stream network (Tsn)】(二) 阅读笔记

贡献 将深度神经网络应用于视频动作识别的难点&#xff0c;是如何同时利用好静止图像上的 appearance information以及物体之间的运动信息motion information。本文主要有三点贡献&#xff1a; 1.提出了一种融合时间流和空间流的双流网络&#xff1b; 2.证明了直接在光流上训…

IDEA运行Java代码报错Command line is too long

Error running xxx: Command line is too long. Shorten command line for xxx or also for Application default configuration.解决方案一 在项目下的.idea/workspace.xml 中 <component name“PropertiesComponent”> 标签下加入 <property name“dynamic.classpa…

学习笔记——Java入门第二季

1.1 介绍类与对象 类和对象的关系&#xff1a; 时间万物皆对象。对象是具体的事物&#xff0c;是类的具体事例 类是抽象的概念&#xff0c;是对象的模板。 new关键字是创建实例对象最重要的标志 Dog duoduonew Dog(); Dog luckynew Dog(); 这样就创建了两个对象并且在java内…

软件系统功能测试的依据

验收测试 一、软件系统功能测试的依据&#xff1a; 采用GB/T 25000.51-2016系统与软件工程系统与软件质量要求和评价(SQuaRE)第51部分&#xff1a;就绪可用软件产品(RUSP)作为测试依据 二、常用功能测试方法&#xff1a; 界面测试 是指对使用界面的软件进行的软件测试&…

Docker 搭建Redis 集群之路

前言 搞技术就是动手&#xff0c;动手再动手&#xff0c;实践出真知&#xff0c;毕竟最终是要解决问题的呢&#xff0c;废话不多讲&#xff0c;开搞&#xff0c;主要是为了记录一下&#xff0c;毕竟过程还是有点艰辛呢需求&#xff08;target&#xff09; Windows 电脑 装一个…

网络层重点协议-IP协议(结构分析)

IP协议数据报格式 一.4位版本号 用来表示IP协议的版本&#xff0c;现有的IP协议只有两个版本IPv4和IPv6 二.4位首部长度 IP协议数据报报头的长度 三.8位服务类型 3位优先权字段&#xff08;已经弃用&#xff09;&#xff0c;4位TOS字段&#xff0c;和1位保留 字段&#xff08;必…

分享 8 个 VSCode 插件,提升你的编码体验

大多数开发者都在不断寻找让开发工作更轻松的方法&#xff0c;我也是如此。合适的工具可以帮助你实现这一目标。 在本文中&#xff0c;我们将探讨我个人使用的八个扩展&#xff0c;以优化我的编码体验。让我们来看看这些扩展的列表&#xff0c;亲自体验它们如何改善你的编码体验…

月报总结|Moonbeam 8月份大事一览

夏日已经趋近尾声&#xff0c;脚下的这片土地正迎来凉爽的秋天。Moonbeam在最炎热的8月中&#xff0c;依然朝着其愿景不断向前迈进。Moonbeam生态也迎来了许多好消息&#xff0c;先前启动的第二批生态Grant计划也完成了最后的链上投票&#xff0c;3个项目成功通过投票&#xff…

如何设计接口认证对接第三方API?

一、前言 在与第三方系统做接口对接时&#xff0c;往往需要考虑接口的安全性问题&#xff0c;本文主要分享几个常见的系统之间做接口对接时的认证方案。 二、认证方案 例如订单下单后通过 「延时任务」 对接 「物流系统」 这种 「异步」 的场景&#xff0c;都是属于系统与系统…

go的iris框架进行本地资源映射到服务端

我这里使用的是HandleDirapi,有其他的请补充 package mainimport ("github.com/kataras/iris/v12" )type Hello struct{Status int json:"status"Message string json:"message" }func main(){app : iris.New()//第一个api:相当于首页app.Get(&q…

业务安全及实战案例

业务安全 关于漏洞&#xff1a; 注入业务逻辑信息泄露 A04:2021 – Insecure Design 在线靶场PortSwigger 1. 概述 1.1 业务安全现状 1.1.1 业务逻辑漏洞 ​ 近年来&#xff0c;随着信息化技术的迅速发展和全球一体化进程的不断加快&#xff0c;计算机和网络已经成为与…

第三章 Linux多线程开发 线程取消 属性 同步 互斥锁 死锁 读写锁 生产者消费者 信号量

线程取消&#xff1a; /*#include <pthread.h>int pthread_cancel(pthread_t thread);- 功能&#xff1a;取消线程&#xff08;让线程终止&#xff09;取消某个线程&#xff0c;可以终止某个线程的运行&#xff0c;但是并不是立马终止&#xff0c;而是当子线程执行到一个…