一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。
骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。
有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。
为了尽快到达公主,骑士决定每次只向右或向下移动一步。
leetcode

解题思路:这是一道比较常规的倒推DP问题。

  • 正推的问题在于,有两个重要的参数会影响后续的决策,自身血量和最低血量。也就是说,这样的动态规划是不满足无后效性的。所以,如果采用倒推,则自身血量就不会影响到后续的决策,因为后面血量再多,也没用。
  • 首先是状态表示,利用一个二维数组表示每个位置到终点的所需的最低血量。
  • 然后是状态转移,取右边和下面两个位置的中的最小值,再减去当前位置的值,就是当前位置所需的最低血量,当然,如果值小于1,那么就将当前结果置为1。
class Solution {public int calculateMinimumHP(int[][] d) {int n = d.length, m = d[0].length;// 构造状态标识数组// 这里的加一是因为在计算右边界和下边界的时候就不用了特殊处理了int[][] f = new int[n + 1][m + 1];// 初始化边界中的值,设置最大就不会取到边界中的值了for(int i = 0; i <= n; i++) {Arrays.fill(f[i], Integer.MAX_VALUE);}// 初始化终点的右下端点值f[n][m - 1] = f[n - 1][m] = 1;// 状态转移for(int i = n - 1; i >= 0; i--) {for(int j = m - 1; j >= 0; j--) {// 选择从右边走和从下边走,所需血量少的方向走int min = Math.min(f[i + 1][j], f[i][j + 1]);// 加上当前这格需要血量,就是最少的所需初始血量// 如果加上当前这格所需的血量,值小于1,说明不需要额外的初始血量,那么就将初始血量置为最小值1f[i][j] = Math.max(min - d[i][j], 1);}}return f[0][0];}
}

算法——地下城游戏(倒推DP)相关推荐

  1. 迭代算法集锦(倒推法)

    求解步骤 1.确定迭代模型 2.建立迭代关系式 3.控制迭代过程 今天我们来用几个简单的例子来了解倒推法 倒推法 1.猴子吃桃 题目描述: 猴子第一天采摘了一些桃子, 第二天吃了第一天的一半多一个, ...

  2. 174. 地下城游戏 逆向dp

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

  3. 倒推法解决“四人玩火柴棍游戏,每一次都是三个人赢,一个人输”问题

    问题:四人玩火柴棍游戏,每一次都是三个人赢,一个人输.输的人要按赢者手中的火柴数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根.现知道玩过四次后,每人恰好输过一次, 而且每人手中都正好有16根火 ...

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

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

  5. 数据结构与算法之倒推算法

    数据结构与算法之倒推算法 倒推算法概念 所谓的倒推法(Inverted Recursion)是对某些特殊问题所采用的违反通常习惯的,从后向前推解问题的方法. 在不知前提条件的情况下,经过从后向前递推, ...

  6. 算法系统学习-正的麻烦反着来呗!(迭代算法-倒推法)

    倒推法 所谓的倒推法,是对某些特殊问题所采用的违反通常习惯的,从后向前推解问题的方法,正向推理比较麻烦时,反而在逆向推理中更加巧妙地解决问题. Case1猴子吃桃问题 一只小猴子摘了若干个桃子,每天吃 ...

  7. [力扣题解] 174. 地下城游戏 DP

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

  8. 实用算法的分析与程序设计——递推法(倒推法)

    倒推法就是在不知初始值的情况下,经某种递推关系而获知问题的解或目标,再倒过来,推知它的初始条件.因为这类问题的运算过程是一一映射的,故可分析得其递推公式,然后再从这个解或目标出发,采用倒推手段,一步步 ...

  9. 地下城游戏(python)

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

最新文章

  1. 微服务平台改造落地解决方案设计
  2. 后勤管理系统_教育信息化2.0,2019年校园智慧后勤管理系统五大品牌
  3. python一般用什么软件写_python用什么软件写代码
  4. 苹果小圆点怎么弄出来_原来苹果手机轻点2下屏幕就能截图,以前还不知道,太方便了...
  5. svn服务器的搭建过程 主要为服务端
  6. 【Flink】Flink Container exited with a non-zero exit code 143
  7. 金盾加密视频破解翻录限制工具使用教程
  8. c语言调用aida64温度,关于aida64软件cpu温度的问题
  9. RMAN-20003错误
  10. 李宏毅机器学习2020笔记(二)Classification
  11. JAVA 面试(更新)
  12. “共享汽车”探索城市交通建设新模式
  13. 网络——tcp/ip
  14. 一个登录的自动化测试用例(新手)
  15. dynamic_cast实现原理
  16. WebRTC系列-移动端硬件编码支持Simulcast
  17. 次世代的眼泪——游戏美术入门必读辛酸史
  18. 【牛客网面经整理】阿里面经
  19. 计算机系智能科学与技术专业考研,什么是智能科学与技术考研?有哪些考研方向?...
  20. GD32系列总结 - 总目录

热门文章

  1. 百度网盘这个开关建议你关闭!会偷偷吃掉1MB/s上传带宽
  2. MySQL查询基础(一)
  3. Python使用pypcap扩展包,抓取视频网站的视频URL
  4. 基于ssm的高校学籍管理系统
  5. linux 12541无监听程序,ORA-12541:TNS:无监听程序问题 解决办法
  6. 如何搭建三层架构?(3)
  7. 中文搜索引擎网址提交入口大全
  8. 乔春洋:品牌文化的功能
  9. ckeditor富文本编辑器使用行间距插件lineheight扩充,改变行距
  10. mysql批量修改表名、删除表