1. 地下城游戏

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

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

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

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

编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。

例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7。-2 (K)  -3  3
-5  -10 1
10  30  -5 (P)

思路:
这题一看就是典型的动态规划问题,关键的难点是找到状态转移方程。
由于房间的数字有负有正,从前往后推导,比较难,需要更多的信息。
考虑从后往前,dp[i][j]表示(i,j)到公主房间所需的最小健康点数。
先考虑最后一个房间,是负数-5, 那就意味着到达该房间的点数必须大于等于5+1,才能存活。
如果房间是正数,就意味这,只要能进入该房间就行。也就是最低点数1。
该房间的最小健康点数=max(1, -dungeon[][] + 1);
这样从一个格子到下一个格子的状态转移方程就出来了:
dp[i][j] = max(1, -dungeon[i][j]+min(dp[i+1][j],dp[i][j+1])) //只能向下或向右走 ,

int calculateMinimumHP(vector<vector<int>>& dungeon) {//动态规划,dp[i][j] 表示从(i,j)格子到终点,所需的最小健康点数int m = dungeon.size();int n = dungeon[0].size();vector<vector<int>> dp(m, vector<int>(n, 0));//从后往前if(dungeon[m-1][n-1] < 0){dp[m-1][n-1] = -dungeon[m-1][n-1] +1;   //健康点数始终要大于1}else{dp[m-1][n-1] = 1;                     //因为如果大于0 , 只需1,最低即可}//最后一列for(int i = m-2; i >=0; i--){dp[i][n-1] = max(1, -dungeon[i][n-1] + dp[i+1][n-1]);        //(i,n-1) 的点数  - 房间点数 = 进入下一个房间的点数}//最后一行for(int i = n-2; i>=0; i--){dp[m-1][i] = max(1, -dungeon[m-1][i] + dp[m-1][i+1]);}for(int i = m-2; i >=0; i--){for(int j = n-2; j >=0; j--){dp[i][j] =max(1, -dungeon[i][j] + min(dp[i+1][j], dp[i][j+1]));    //选择下方或右方小的}}return dp[0][0];}

leetcode题库174 地下城游戏相关推荐

  1. LeetCode刷题系列-- 174. 地下城游戏

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

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

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

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

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

  4. LeetCode 174.地下城游戏

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

  5. LeetCode 174. 地下城游戏 | Python

    文章目录 174. 地下城游戏 题目 解题思路 代码实现 实现结果 欢迎关注 174. 地下城游戏 题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/ ...

  6. Java实现 LeetCode 174 地下城游戏

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

  7. 力扣174. 地下城游戏

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

  8. 力扣——174.地下城游戏(困难难度)——万能的递归与动态分析

    力扣--174. 地下城游戏 一.算法目录合集 1.地址 2.说明 二.题目说明 1.题干 2.原地址 三.实现步骤 1.思路分析 1.1.分析问题 1.2.具体步骤 ① 特殊情况分析 ② 常规分析 ...

  9. 力扣 -- 174. 地下城游戏

    题目链接:174. 地下城游戏 - 力扣(LeetCode) 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴. 参考代码: class Solution { ...

最新文章

  1. 【朋克智库】比特币详解2.0——比特币的沉沦
  2. mysql 批量更新语句
  3. 中石油训练赛 - Match Matching(完全背包)
  4. 获取远程计算机动态ip,c# - 获取远程主机的IP地址
  5. 找出OData service出错根源的小技巧
  6. HDU-5895 Mathematician QSC
  7. 漫步凸分析八——回收锥与无界
  8. mongo 让字段自增或自减
  9. apache tuscany(一)
  10. java 数据流 中文_【Java I/O流】File、字符集、字节流、字符流、缓冲流、数据流、对象流、序列化、try-wi...
  11. android fastboot模式,fastboot
  12. Spring 的事务传播机制
  13. Redhat Enterprise Linux磁带机简单操作
  14. 树莓派控制火焰传感器
  15. ios 渐变透明背景_PPT设计的总是太单调,不如换个背景试试,超精彩!
  16. 批量识别图片中文字(python、百度开发者工具)
  17. sk_buff 介绍
  18. GIT客户端连接码云
  19. 在计算机领域中图形用户界面,带图形用户界面的计算机
  20. 六大质疑拷问大中华第一妖股 蒙古能源估值调查

热门文章

  1. idea 查询项目代码行数_程序员的福利,四个技巧,让OneNote支持代码高亮
  2. 数据结构 5-4-1 并查集
  3. 数据挖掘原理与算法 DBSCAN
  4. LeetCode 61. 旋转链表(python、c++)
  5. Python之 break退出循环
  6. MATLAB中数组的原始索引和线性索引之间相互进行转换
  7. JS助记 ----- 正则表达式
  8. USB 协议分析之 HID 设备(转)
  9. 从一次线上故障思考Java问题定位思路
  10. 史上最全的MSSQL复习笔记