题目链接

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];}
}

动态规划——地下城游戏相关推荐

  1. LeetCode--174.地下城游戏(动态规划)

    地下城游戏(动态规划) 1. 题目描述 2. 题目分析 3. C语言实现 1. 题目描述 难度:困难 2. 题目分析 这道题是64.最小路径和的进阶版.但是这一题我们不能从左上向右下的顺序,而是**要 ...

  2. 【中等】龙与地下城游戏问题-Java:经典动态规划解法

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程 package live.every.day.ProgrammingDesign.Codi ...

  3. 【中等】龙与地下城游戏问题-Java:经典动态规划结合空间压缩解法

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程 package live.every.day.ProgrammingDesign.Codi ...

  4. 递归与动态规划---龙与地下城游戏问题

    [题目] 给定一个二维数组map,含义是一张地图,例如如下,矩阵: -2 -3 3 -5 -10 1 0 30 -5 游戏规则如下: 骑士从左上角出发,每次只能向右或者向下走,最后到达右下角见到公主. ...

  5. 动态规划C++实现--龙与地下城游戏

    题目:龙与地下城游戏 给定一个二维数组map,含义是一张地图,例如,如下矩阵: -2   -3    1 -5  -10   1 0    30  -5 游戏的规则如下: 骑士从左上角出发,每次只能向 ...

  6. 力扣174. 地下城游戏

    力扣174. 地下城游戏 文章目录 力扣174. 地下城游戏 一.题目描述 二.分析 三.完整代码 一.题目描述 二.分析 这个题一看就可以用动态规划,就需要确定动态规划的状态和选择以及状态转移方程 ...

  7. leetcode题库174 地下城游戏

    地下城游戏 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. ...

  8. leetcode 思路——64. 最小路径和——174. 地下城游戏

    leetcode 思路--64. 最小路径和--174. 地下城游戏 64. 最小路径和 174. 地下城游戏 64. 最小路径和 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角 ...

  9. [算法]LeetCode每日一题--174. 地下城游戏(Java)

    DailyChallenge 174. 地下城游戏 Hard20200712 Description 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格. ...

最新文章

  1. c语言用数组写密码程序,想程序高手求助--用C语言来编辑一个输入密码的程序...
  2. win10无限重启_win10系统安装无限循环如何解决_win10教程
  3. ElasticSearch启动报错curl: (7) Failed connect to 172.19.128.56:9200; 拒绝连接---ElasticSearch工作笔记029
  4. 北京国际大数据交易所成立,采用区块链技术分离数据所有权
  5. 26. The Greenhouse Effect and Its Consequences 温室效应及其后果
  6. 重启 Mac 后停止更改壁纸的 4 种方法
  7. 计算机科学现代教育,现代教育技术教程-计算机科学教育.pdf
  8. albrooks图表解读_【正版全新】日本蜡烛图交易技术分析:详细解读价格行为模式 [美] 艾尔·布鲁克(Al Brooks)...
  9. 文件夹加密狗的加密原理与解密
  10. 雷军给陈年总结的小米十条经验
  11. CCF认证201403-1相反数
  12. 二进制bit0是什么意思_阜平吧在讨论5G的问题,感觉挺有意思,科普下……
  13. linux外置光驱调速,买内置不如买外置 五款外置光驱推荐
  14. Docker系列(1-简介篇) -- 为什么要使用docker?
  15. 海兰云发布海底数据中心(UDC)解决方案
  16. 通过串口打印DS18B20采集到的温度
  17. 最任性热酷拿到最重磅IP,《找你妹2015》获央视春晚吉祥物阳阳版权
  18. 汇众教育举办“注定不凡”17周年暨V10.0新产品上海站发布会
  19. userscripts.org最新网址
  20. 如果不做软件测试了,做什么

热门文章

  1. 计算机双CPU,双CPU的电脑用起来,性能和功耗都是原来的两倍?
  2. beego--session使用redis引擎
  3. 图片标注工具LabelImg的简单安装
  4. EasyExcel导出动态合并单元格
  5. 2022 年精选架构合集:Redis+Nginx+ 设计模式 +Spring 全家桶 +Dubbo
  6. centos7设置屏幕保护
  7. 我的OS X系统使用小结
  8. 什么是Ajax?我们怎样使用Ajax?
  9. begintransaction EndTransaction
  10. stm32+ESP8266AT指令详细说明