174. Dungeon Game

文章目录

  • 1题目理解
  • 2 分析

1题目理解

故事背景:恶魔把公主抓走了,关在地牢里面。骑士想要把公主救出来。初始化的时候,骑士有一个健康值init。
输入:int[][] dungeon表示地牢中魔鬼布局图。dungeon[i][j]>0,恶魔会提高骑士的健康值dungeon[i][j];dungeon[i][j]会降低 骑士健康值(掉血)。如果骑士健康值为0,那骑士就牺牲了。
输出:骑士需要的最小健康值。
例如:
输入:

-2 (K)-33
-5-101
1030-5(P)

输出:7
按照 右->右->下->下的路线,健康值最小是7即可。

2 分析

解题思路来源于力扣。
从左上角走到右下角有很多种走法,参考63题。找到每一种需要的最小健康值,求最小值就是答案。对于这种比较难的题目,会先列出解题框架然后再分析填充。
先写暴力搜索的框架。将与状态无关的变量:dungeon,m,n等放到实例变量中。从(0,0)开始走,横纵坐标是状态相关的,作为方法参数。

class Solution {private int[][] dungeon;private int m;private int n;private int minHealth;public int calculateMinimumHP(int[][] dungeon) {this.dungeon = dungeon;m = dungeon.length;n = dungeon[0].length;minHealth = Integer.MAX_VALUE;visit(0,0);return minHealth;}private void visit(int i, int j){if(i>=m || j>=n){....return;}...}
}

需要保证骑士在到达(i,j)之后健康值大于0,那就需要上一步的健康值。
从(i,j)可以达到(i+1,j)、(i,j+1)。

class Solution {...public int calculateMinimumHP(int[][] dungeon) {this.dungeon = dungeon;m = dungeon.length;n = dungeon[0].length;minHealth = Integer.MAX_VALUE;visit(0,0,0);return minHealth;}private void visit(int i, int j, int preHealth){if(i>=m || j>=n){return;}int health = preHealth+ dungeon[i][j];...}
}

health如果小于1,那么就需要abs(health)+1的初始健康值。
health如果大于 1,那么就初始健康值可以为0。

也就是 init=0 if health>=1;init=abs(health)+1,if health<=0

找到了当前状态的init,还需要查找到这条路径上最大的init才是就出公主的,当前路径上需要的最小的init。例如-2->-3->3->1->-5这条路径。在(0,1)这一点health=6,那么init=0。在(0,2),init = 3。需要找到这条路径上的最大值,才能保证走这条路完成任务。

class Solution {...private void visit(int i, int j, int preHealth,int maxInitOfPath){if(i>=m || j>=n){return;}preHealth += dungeon[i][j];int init = preHealth>=1?0:Math.abs(preHealth)+1;maxInit = Math.max(maxInit,init);}
}

接下来分析完成的标志是到达(m,n-1),或者(m-1,n)。达到(m-1,n-1)之后,再走一步,确定全局最小init。

	public int calculateMinimumHP(int[][] dungeon) {this.dungeon = dungeon;m = dungeon.length;n = dungeon[0].length;minHealth = Integer.MAX_VALUE;visit(0,0,0,0);return minHealth;}private void visit(int i, int j, int preHealth,int maxInitOfPath){if(i==m-1 && j==n || i==m && j==n-1){minHealth = Math.min(minHealth,maxInitOfPath);return;}if(i>=m || j>=n){return;}preHealth += dungeon[i][j];int init = preHealth>=1?0:Math.abs(preHealth)+1;maxInitOfPath = Math.max(maxInitOfPath,init);visit(i+1,j,preHealth,maxInitOfPath);visit(i,j+1,preHealth,maxInitOfPath);}

minHealth就是最小需要的初始健康值。
再进一步观察发现preHealth其实就是路径上dungeon[i][j]的和。maxInitOfPath的取值和整条路径中的的最小值有关系。也就是说路径和、路径上的最小值,与最终结果有关系。动态规划只能表示一个变量,没有办法把这两个因素都放入转移方程。

如果从右下角向左上角进行递归,我们需要保证达到(i,j)的时候的路径和preSum>dungeon[i][j],即可。
令dp[i][j] 表示从坐标 (i,j)(i,j) 到终点所需的最小初始值,dp[i][j]与dp[i+1][j]、dp[i][j+1]有关系 。
dp[i][j]=min(dp[i+1][j],dp[i][j+1])−dungeon[i][j]dp[i][j] = min(dp[i+1][j],dp[i][j+1]) - dungeon[i][j]dp[i][j]=min(dp[i+1][j],dp[i][j+1])dungeon[i][j]
考虑初始化: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[] d : dp){Arrays.fill(d,Integer.MAX_VALUE);}dp[m][n-1]=dp[m-1][n]=1;for(int i=m-1;i>=0;i--){for(int j=n-1;j>=0;j--){int min =  Math.min(dp[i+1][j], dp[i][j+1]);dp[i][j] = Math.max(min-dungeon[i][j],1);}}return  dp[0][0];}}

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

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

相关文章

第八十期:初创公司5大Java服务困局,阿里工程师如何打破?

初创公司遇到的每一个问题都可能攸关生死。创业之初更应该总结行业的常见问题&#xff0c;对比方案寻找最优解。 作者&#xff1a;常意 初创公司遇到的每一个问题都可能攸关生死。创业之初更应该总结行业的常见问题&#xff0c;对比方案寻找最优解。阿里巴巴地图技术专家常意在…

关于某些人和某些事的断想

关于某些人和某些事的断想<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />人的一生总会碰到这样那样的一些人和一些事&#xff0c;偶然或必然。这些人、这些事或许在我们的心里荡起过些许的波澜&#xff1b;又或许只是一闪而过&…

第八十一期:Java性能优化:35个小细节,提升你的Java代码运行效率

如果项目着眼于尽快无BUG上线&#xff0c;那么此时可以抓大放小&#xff0c;代码的细节可以不精打细磨&#xff1b;但是如果有足够的时间开发、维护代码&#xff0c;这时候就必须考虑每个可以优化的细节了&#xff0c;一个一个细小的优化点累积起来&#xff0c;对于代码的运行效…

Python数据类型与运算符号

一&#xff1a;数据类型 【1】为什么要有数据类型 &#xff08;1&#xff09;不同的数据含有不同的特征 例如&#xff1a;有文本数据 音频数据 视频数据 &#xff08;2&#xff09;不同的特征需要有不同的类型用来描述 二&#xff1a;数据类型的分类 【1】 &#xff08;1&#…

85. Maximal Rectangle

用dp计算矩形面积 文章目录1题目理解2分析2.1 暴力搜索2.2 动态规划3 相关题目1题目理解 输入&#xff1a;char[][] matrix 是一个二维数组&#xff0c;值由0和1组成。 输出&#xff1a;一个矩形的面积&#xff0c;这个矩形只包含1。 例子&#xff1a; Input: [ [“1”,“0”,…

全面搞定jive3.1.1

全面搞定jive3.1.1yippit 原创 (参与分&#xff1a;351&#xff0c;专家分&#xff1a;1740) 发表&#xff1a;2003-9-13 下午8:33 版本&#xff1a;1.0 阅读&#xff1a;8316次 近日坛子里面很多人问起这个问题&#xff0c;要么中文显示乱码出错&#xff0c;要么不能数…

spring mvc学习(6):springMVC的常见注解

1RequestMapping的位置可以在类名或者方法名之前 或者同时加在两个位置 最终的路径是两个位置路径的组合 value是默认的名称&#xff0c;可以省略&#xff0c;如果有其他参数&#xff0c;就不能省略 如下配置的访问路径&#xff1a;协议://主机&#xff1a;//端口/虚拟路径…

powershell some check

// TODO 待处理 1 # powershell 编写的某些校验2 3 function listChecks() {4 write-host 可用的校验;5 write-host CRC - 循环冗余校验;6 return -- done;7 }8 9 # 字节数组 CRC, 不知道是不是符合CRC定义 10 function crcCheck($byteArray) { 11 if ($byteAr…

801. Minimum Swaps To Make Sequences Increasing

文章目录1题目理解2 暴力搜索3 动态规划3.1第一种情况3.2第二种情况1题目理解 输入&#xff1a;两个int数组A和B&#xff0c;长度都不为0&#xff0c;并且长度相同。 输出&#xff1a;最小交换次数。 规则&#xff1a;最终想要得到两个严格递增的数组。如果原始数组不符合要求…

用属性还是字段?

用属性还是字段&#xff1f; 我觉得对于实体类(没有方法的类)&#xff0c;只要用字段就好了&#xff0c;没必弄得像下面这个样子&#xff1a; private AttributeConfig m_ColumnMap;public AttributeConfig ColumnMap{get{return m_ColumnMap;}set{m_ColumnMapvalue;}}posted …

spring mvc学习(7):springmvc学习笔记(常用注解)

1. Controller Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用Controller注解定义的控制器有如下特点: 不需要继承任何类, 也不需要实现任何接口可以处理多个请求可以使用Servlet的相关特性 spring自动扫描所有基于注解的类, 并将其注册为spring…

模板——树状数组求逆序对

题目链接&#xff1a;https://www.luogu.org/problemnew/show/P1908 1 #include <map>2 #include <set>3 #include <cmath>4 #include <queue>5 #include <string>6 #include <cstdio>7 #include <cstring>8 #include <iostream&…

818. Race Car

文章目录1 题目理解2 BFS3 dp3.1 基本情况3.2 递归方程分析3.2.1 先超过target再调头3.2.2 不超过target4 说明1 题目理解 先讲规则。一辆小汽车停在位置0&#xff0c;并且方向朝向右侧&#xff0c;并且速度为1。小汽车每次可以选择加速A&#xff0c;那加速一次&#xff0c;新…

spring mvc学习(8):springmvc常用注解代码

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

找了好久的BUG

找了好久的BUG <rsp:WEBPAGE id"PageContainer" TabSectionID"*****" runat"server"></rsp:WEBPAGE> <rsp:PLACEHOLDER id"AdminPage_Title" runat"server">公文流转流程工作点定义</rsp:PLACEHOLDER&…

python-if条件判断与while/for循环

条件判断if 让计算机像人一样&#xff0c;能判断是非对错&#xff0c;根据条件做一些事情。 if ------ if代码结构&#xff1a;------- if 条件:代码体tips&#xff1a;同一缩进范围内的代码被视作同一代码体,python官方推荐python缩进一次为4个空格is_happy True if is_happ…

第八十二期:掌握这些监控报警优化技巧,百万年薪不在话下!

运维工程师面试者第一个问题是&#xff1a;需要值班吗?笔者自己也曾经历过月入十万的时期&#xff0c;在那个时候&#xff0c;数个系统同时发布下一代版本&#xff0c;而老系统还需要过渡很长时间&#xff0c;工作量直接翻倍。 作者&#xff1a;焦振清 运维工程师面试者第一…

dp按照规模分类总结

本文章的内容来源于花花酱dp2。 做多了dp的题目之后总觉得有什么规律&#xff0c;但是自己没总结出来。花花酱按照输入规模、子问题个数、在解决一个问题的时候需要依赖的子问题个数为特征对题目做了分类。 其中绿色是比较简单的 &#xff0c;黄色是中等的&#xff0c;粉色是…

看了交大自产的电影《我的太阳》

呵呵&#xff0c;现在大学生自导自拍自演的电影越来越多了&#xff0c;不知道算是中国第几代导演&#xff1a;&#xff09; 我看电影一般比较关注情节&#xff0c;演技暂且不提。因为是校园电影&#xff0c;本片自然比较接近大学生生活&#xff0c;总体情节比较浪漫曲折(虽然部…

【BZOJ4559】【JLOI2016】—成绩比较(拉格朗日插值+dp)

传送门 dpdpdpf[i][j]f[i][j]f[i][j]表示前iii门课&#xff0c;有jjj个人没有被碾压的方案数 考虑f[i−1][j]f[i-1][j]f[i−1][j]转移到f[i][w](j≤w)f[i][w](j\le w)f[i][w](j≤w) 首先要选出w−jw-jw−j个新的没被他碾压的人 由于之前已经有一些没被碾压的人,所以方案数为(n−…