LeetCode Dungeon Game
2015-09-22 02:15
204 查看
原题链接在这里:https://leetcode.com/problems/dungeon-game/
这是一道DP题,保存当前格到右下格所需要的最小体力,m*n的dp数组保存。
更新是Math.min(走右侧最小体力,左下侧最小体力). 走右侧最小体力 = Math.max(dp[i][j+1]- dungeon[i][j], 0). 假设一直dp[i][j+1] = 3, dungeon[i][j] = -5, 3-(-5) = 8是往右走所需的最小体力, 但若是dp[i][j+1] = 3, dungeon[i][j] = 8, 3-8 = -5, 当前吃的魔法豆加了8点体力,根本不需要最小体力值就可以往右走,所以所需最小体力为0. 往下走同理。
先出示右下角的点,再初始最后一行和最后一列。
Note: 1.最后返回的不是dp[0][0], 而是dp[0][0]加一,因为之前求得体力值的最小值是0, 但骑士的体力值必须是正数。
2. 之所以选择从后往前更新而不是从前往后更新是因为,从前往后更新时求得的局部最优不保证是全局最优。
AC Java:
这是一道DP题,保存当前格到右下格所需要的最小体力,m*n的dp数组保存。
更新是Math.min(走右侧最小体力,左下侧最小体力). 走右侧最小体力 = Math.max(dp[i][j+1]- dungeon[i][j], 0). 假设一直dp[i][j+1] = 3, dungeon[i][j] = -5, 3-(-5) = 8是往右走所需的最小体力, 但若是dp[i][j+1] = 3, dungeon[i][j] = 8, 3-8 = -5, 当前吃的魔法豆加了8点体力,根本不需要最小体力值就可以往右走,所以所需最小体力为0. 往下走同理。
先出示右下角的点,再初始最后一行和最后一列。
Note: 1.最后返回的不是dp[0][0], 而是dp[0][0]加一,因为之前求得体力值的最小值是0, 但骑士的体力值必须是正数。
2. 之所以选择从后往前更新而不是从前往后更新是因为,从前往后更新时求得的局部最优不保证是全局最优。
AC Java:
public class Solution { public int calculateMinimumHP(int[][] dungeon) { if(dungeon == null || dungeon.length == 0 || dungeon[0].length == 0){ return 0; } int m = dungeon.length; int n = dungeon[0].length; int [][] dp = new int[m] ; dp[m-1][n-1] = dungeon[m-1][n-1] < 0 ? -dungeon[m-1][n-1]:0; for(int i = m-2; i>=0; i--){ dp[i][n-1] = dp[i+1][n-1] - dungeon[i][n-1] > 0 ? dp[i+1][n-1] - dungeon[i][n-1] : 0; } for(int j = n-2; j>=0; j--){ dp[m-1][j] = dp[m-1][j+1] - dungeon[m-1][j] > 0 ? dp[m-1][j+1] - dungeon[m-1][j] : 0; } for(int i = m-2; i>=0; i--){ for(int j = n-2; j>=0; j--){ dp[i][j] = Math.min((dp[i+1][j] - dungeon[i][j] > 0 ? dp[i+1][j] - dungeon[i][j]: 0), (dp[i][j+1] - dungeon[i][j] > 0 ? dp[i][j+1] - dungeon[i][j]: 0)); } } return dp[0][0]+1; } }
相关文章推荐
- Linux上安装DB2
- Ember.js 入门指南——工具类的助手
- bash编程之:函数与数组
- EJB面试题
- *LeetCode-Perfect Squares
- 虚拟机桥接网络连接方式
- vc2010下mongodb驱动的编译与环境搭建
- 虚拟机搭建ftp环境
- JDBC和JTA事务区别
- 使用SQL Server CONVERT() 函数
- 多点触控及一个华丽的Demo
- UIButton的竖排图片和文本
- 创建keil project(89C52)并且仿真流水灯
- 对parseInt的深入理解
- EJB的persist 和 merge,refresh
- 菜鸟系列——简单搜索
- 文章标题
- Python中的装饰器
- 第二次作业——结对项目之需求分析与原型模型设计
- 过了两周的大二