✡ 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)最初被安置在左上角的房间里,他必须穿过地下 ...
随机推荐
- aspx文件为什么会慢
你可以在 global.asax 的 Application_Start 方法中写一个日志,例如写 C# code ? 1 2 3 4 5 void Application_Start(objec ...
- onBackPressed
onBackPressed()此为进行返回当前的activity 看源码
- 浅谈sizeof
问题:1)sizeof是函数吗:2)sizeof功能:3)具体问题下sizeof值 1)sizeof不是函数,是C语言的一个关键字 2)sizeof作为右值时,求①某个数据类型(sizeof(int) ...
- Ubuntu下用wireshark抓取802.11封包并进行过滤分析
要用wireshark抓802.11的包 需要在linux下进行. 要在linux下抓802.11的包 需要在linux下安装无线网卡驱动. 所以 在正式抓取之前先把这两样东西搞起来. *没有特殊说明 ...
- [DNS][转]EDNS
随着业务的复杂化和多样化,RFC1035中定义的DNS消息格式和它支持的消息内容已经不足以满足一些DNS服务器的需求,于是,RFC2671 中提出了一种扩展DNS机制EDNS(Extension Me ...
- WebAPI返回数据类型解惑[转]
最近开始使用WebAPI,上手很容易,然后有些疑惑 1.WebAPI默认返回什么数据类型,json还是xml? 2.怎么修改WebAPI的返回数据类型,我用IE浏览器请求返回的数据都是JSON格式的, ...
- SharePoint Framework 配置Office 365开发者租户
博客地址:http://blog.csdn.net/FoxDave 你需要一个Office 365开发者租户来使用预览版SharePoint Framework构建和发布客户端web部件.你的租户 ...
- K近邻分类法
K近邻法 K近邻法:假定存在已标记的训练数据集,分类时对新的实例根据其K个最近邻的训练实例的类别,通过多数表决等分类决策规则进行预测. k近邻不具有显示学习的过程,是“懒惰学习”(lazy learn ...
- oracle问题
(1) 连通性: 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小 监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇 ...
- oracle数据类型
本文转自:http://blog.csdn.net/defonds/article/details/4302695 谢谢原文作者 有道是,磨刀不误砍柴工.多了解一些底层的东西,对于Oracle开发.维 ...