动态规划——地下城游戏

news/2024/7/23 15:04:45 标签: 动态规划, 游戏, 算法

题目链接

leetcode在线oj题——地下城游戏

题目描述

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

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

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

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

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

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

题目示例

示例1

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

示例2

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

题目提示

  • m == dungeon.length
  • n == dungeon[i].length
  • 1 <= m, n <= 200
  • -1000 <= dungeon[i][j] <= 1000

解题思路

之前介绍的动态规划题目都是从左上角开始,迭代动态规划方程,一直走到右下角,得到最终的结果,但是这道题是需要我们给出初始的血量,因此需要从右下角开始,向左上角迭代

当进入到负数的房间时,骑士会扣血,但是我们是从最后一个房间推导前面的房间,因此往前走遇到负数需要加血,遇到正数可以减血

而当前状态最小血量应该是走下面和走右面都可以支撑,因此是求下面和右面状态的较小者 - 当前房间的buff

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

如果得到的数字是负数,说明到这个位置骑士已经死了,这是不应该的,骑士最小也要有一点血,因此将其重新变为1点血

dp[i][j] = Math.max(1, dp[i][j]);

从右下角开始迭代需要考虑越界问题,最下面一行和最右面一列会出现越界,为了简化代码,可以将dp数组多添加一行一列,而为了不改变动态方程的有效性,最下面一行和最右面一列需要填入不影响其他位置的值——正无穷大

而为了使得最后一个房间的buff减益后还能剩一点血量,dp[m - 1][n] = dp[m][n - 1] = 1;

完整代码

class Solution {
    public int calculateMinimumHP(int[][] dungeon) {
        int m = dungeon.length;;
        int n = dungeon[0].length;
        int[][] dp = new int[m + 1][n + 1];

        for(int i = 0; i <= n; i++){
            dp[m][i] = Integer.MAX_VALUE;
        }
        for (int i = 0; i <= m; i++) {
            dp[i][n] = Integer.MAX_VALUE;
        }
        dp[m - 1][n] = 1;
        dp[m][n - 1] = 1;

        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]);
            }
        }
        return dp[0][0];
    }
}

http://www.niftyadmin.cn/n/1006418.html

相关文章

Quiz 14_2-2: Using Web Services | Python for Everybody 配套练习_解题记录

文章目录 Python for Everybody课程简介Quiz 14_2-2: Using Web Services单选题&#xff08;1-15&#xff09;操作题Autograder 1: Extract Data from JSONAutograder 2: Calling a JSON API Python for Everybody 课程简介 Python for Everybody 零基础程序设计&#xff08;P…

centos7.X安装docker---个人学习经验

工具&#xff1a;VMware Workstation Pro 16.1 系统&#xff1a;CentOS-7-x86_64-DVD-2009 docker&#xff1a;docker-ce-24.0.2-1 说明&#xff1a;这是个人在学习安装docker的时候一些经验&#xff0c;如有不对的还请指教&#xff0c;有些步骤因个人专业能力和时间问题并未…

【Django入门系列】Django基础

在本章中&#xff0c;我们将学习Django的基础知识&#xff0c;包括创建第一个Django项目、Django项目的组织结构、模型-视图-控制器&#xff08;MVC&#xff09;设计模式、Django中的URL和路由以及Django的模板语言。 一、创建第一个Django项目 首先&#xff0c;我们需要安装…

c++11 标准模板(STL)(std::basic_ostream)(二)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

基于Java校园车辆管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

力扣、每日一练:爬楼梯

文章目录 一、题目二、解题思路&#xff1a;三、考察的知识点&#xff1a;四、使用Python语言巧妙实现&#xff1a;五、总结一下收获&#xff1a; 一、题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&am…

2023-07-01 用C语言把科学计数法转换为普通数字,使用double value; sscanf(str, “%lf“, value );就可以做到。

一、在科学计数法中&#xff0c;为了使公式简便&#xff0c;可以用带 “E” 的格式表示。例如 1.09乘10的7次方&#xff0c;可简写为 “1.09E07” 的形式&#xff0c;其中 ”E“ 是 exponent(指数) 的缩写&#xff0c;可以不区分e的大小写&#xff0c;用e或者E都可以。 二、比…

抖音SEO矩阵源码开发(一)

前言&#xff1a; 1.抖音SEO矩阵系统源码开发 是一项技术密集型工作&#xff0c;需要对大数据处理、人工智能等领域有深入了解。该系统开发过程中需要用到多种编程语言在服务器上安装LNMP环境&#xff0c;包括Linux操作系统、Nginx、MySQL、PHP等&#xff0c;如Java、Python等…