✡ leetcode 174. Dungeon Game 地牢游戏 --------- java
The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. The dungeon consists of M x N rooms laid out in a 2D grid. Our valiant knight (K) was initially positioned in the top-left room and must fight his way through the dungeon to rescue the princess.
The knight has an initial health point represented by a positive integer. If at any point his health point drops to 0 or below, he dies immediately.
Some of the rooms are guarded by demons, so the knight loses health (negative integers) upon entering these rooms; other rooms are either empty (0's) or contain magic orbs that increase the knight's health (positive integers).
In order to reach the princess as quickly as possible, the knight decides to move only rightward or downward in each step.
Write a function to determine the knight's minimum initial health so that he is able to rescue the princess.
For example, given the dungeon below, the initial health of the knight must be at least 7 if he follows the optimal path RIGHT-> RIGHT -> DOWN -> DOWN.
| -2 (K) | -3 | 3 |
| -5 | -10 | 1 |
| 10 | 30 | -5 (P) |
Notes:
- The knight's health has no upper bound.
- Any room can contain threats or power-ups, even the first room the knight enters and the bottom-right room where the princess is imprisoned.
题意说的是,从一个矩阵的左上角走到右下角,每个格子里面代表的是血量需要加多少或者减多少。
然后需要血量在图中保持正数,在只能向右和向下的情况下,求从左上角到右下角需要的最小血量。
很明显用DP,但是如何用DP,刚开始的想法是,
1、用两个数组,一个数组记录到当前位置需要的最小血量min[len],另一个是在最小血量的情况下路径上的数的和sum[len]。
2、第一行因为只能一直向右走,所以很简单。
3、从第二行开始,有两种选项,从上面来还是从左边来(第一个单独算),然后比较这两种选项需要的最小血量,选择较小的那条路。
4、在两种选项的血量一样的时候,选择sum较大的走。
但是这样会出错。
[[1,-3,3],[0,-2,0],[-3,-3,-3]]这一组就会出错,因此这样是不对的。局部最优不等于全局最优。
public class Solution {//错误代码
public int calculateMinimumHP(int[][] dungeon) {
if (dungeon.length == 1 && dungeon[0].length == 1){
if (dungeon[0][0] > 0){
return 1;
} else {
return -dungeon[0][0]+1;
}
}
int len = dungeon[0].length;
int[] min = new int[len];
int[] sum = new int[len];
int num = dungeon[0][0];
min[0] = Math.max(1, -num + 1);
sum[0] = num;
for (int i = 1; i < len; i++){
num += dungeon[0][i];
sum[i] = num;
min[i] = Math.max(-num + 1, min[i - 1]);
}
int flag = 0;
int flag2 = 1;
for (int i = 1;i < dungeon.length; i++){
sum[0] += dungeon[i][0];
min[0] = Math.max(min[0], -sum[0] + 1);
for (int j = 1;j < len; j++){
if (min[j - 1] < min[j] || (min[j - 1] == min[j] && sum[j - 1] > sum[j])){
sum[j] = sum[j - 1] + dungeon[i][j];
min[j] = Math.max(min[j - 1], -sum[j] + 1);
} else {
sum[j] += dungeon[i][j];
min[j] = Math.max(min[j], -sum[j] + 1);
}
}
}
return min[len - 1];
}
}
2、反过来,从结尾开始,表示当前位置到结尾最少需要的血量
public class Solution {
public int calculateMinimumHP(int[][] dungeon) {
if (dungeon.length == 1 && dungeon[0].length == 1){
if (dungeon[0][0] > 0){
return 1;
} else {
return -dungeon[0][0] + 1;
}
}
int len = dungeon[0].length;
int row = dungeon.length;
int[] min = new int[len];
min[len - 1] = -dungeon[row - 1][len - 1] + 1;
min[len - 1] = Math.max(min[len - 1], 1);
for (int i = len - 2; i >= 0; i--){
min[i] = min[i + 1] - dungeon[row - 1][i];
min[i] = Math.max(min[i], 1);
}
for (int i = row - 2; i >= 0; i--){
min[len - 1] = min[len - 1] - dungeon[i][len - 1];
min[len - 1] = Math.max(min[len - 1], 1);
for (int j = len - 2; j >= 0; j--){
min[j] = Math.min(min[j + 1], min[j]) - dungeon[i][j];
min[j] = Math.max(min[j], 1);
}
}
return min[0];
}
}
✡ leetcode 174. Dungeon Game 地牢游戏 --------- java的更多相关文章
- [LeetCode] 174. Dungeon Game 地牢游戏
The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. ...
- [leetcode]174. Dungeon Game地牢游戏
The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. ...
- [LeetCode] Dungeon Game 地牢游戏
The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. ...
- Java for LeetCode 174 Dungeon Game
The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. ...
- 174 Dungeon Game 地下城游戏
一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格布局.我们英勇的骑士(K)最初被安置在左上角的房间里,并且必须通过地下城对抗来拯救公主.骑士具有以正整数 ...
- leetcode@ [174] Dungeon Game (Dynamic Programming)
https://leetcode.com/problems/dungeon-game/ The demons had captured the princess (P) and imprisoned ...
- Leetcode#174 Dungeon Game
原题地址 典型的地图寻路问题 如何计算当前位置最少需要多少体力呢?无非就是在向下走或向右走两个方案里做出选择罢了. 如果向下走,看看当前位置能提供多少体力(如果是恶魔就是负数,如果是草药就是正数),如 ...
- LeetCode 174. Dungeon Game (C++)
题目: The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dung ...
- leetcode 174. 地下城游戏 解题报告
leetcode 174. 地下城游戏 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下 ...
随机推荐
- java中“/0”含义
public class Test { public static void main(String[] args) { // 正常情况下,对这个0,tp中储的是其对应的ASCII码48 char t ...
- Java特性-HashMap
想分享一个对HashMap的理解: 我们首先要知道一个HashMap对象的构成,一般的理解是:一个Map里面放了很多个键值对,合在一起就是一个键值对的数组: 大概这么理解没问题,可是有一点要说明一下, ...
- Groovy解析xml并且注入Project,TestSuite,TestCase级别的custom properties
import com.eviware.soapui.support.GroovyUtils import groovy.util.XmlParser def groovyUtils = new Gro ...
- 第二章 JavaScript语法·
javascript代码放置位置: 1.将代码放置在文档<head>标签中的<script>标签之间: 2.将代码存为一个扩展名为.js的独立文件.典型做法是在文档的<h ...
- jQuery原生框架-----------------dom操作
// 扩展DOM操作方法jQuery.fn.extend({ // 设置或者获取元素的内容 html: function( html ) { /* * 实现思路: * 1.不传参,返回第一个元素的内容 ...
- Spearman秩相关系数和Pearson皮尔森相关系数
1.Pearson皮尔森相关系数 皮尔森相关系数也叫皮尔森积差相关系数,用来反映两个变量之间相似程度的统计量.或者说用来表示两个向量的相似度. 皮尔森相关系数计算公式如下:
- 2014年5月份第4周51Aspx源码发布详情
最基本wcf服务器与客户端交互源码 2014-5-26 [VS2003]源码描述:本示例讲解的是最基本的wcf语法,示例浏览请先运行服务端,然后在运行客户端,适合想要学习wcf的初学者.仅供借鉴,欢 ...
- 微信平台上遇到的bug
做微信平台遇到的bug,没有什么方法修改,至今只是避免出现,还未解决 1.header的position:fixed定位:如果整个页面的高度不足屏幕高度时,安卓部分手机header与title之间会有 ...
- python基础之内置函数
该博客内容参考http://www.cnblogs.com/wupeiqi/articles/4943406.html 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经 ...
- 完成Matrix丶Kingdom PPT后的感想
这次Presentation是我在这节课的第一次上台演讲,让我感悟良多. 具体对我的PPT有兴趣的朋友可以call我,我会共享给大家. 这次老师布置的任务对我而言很有意义.首先,我作为最后一组,我欣赏 ...