174 Dungeon Game 地下城游戏
一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格布局。我们英勇的骑士(K)最初被安置在左上角的房间里,并且必须通过地下城对抗来拯救公主。
骑士具有以正整数表示的初始健康点。如果他的健康点在任何时候降至 0 或以下,他会立即死亡。
有些房间由恶魔守卫,因此骑士在进入这些房间时失去健康点(负整数);其他房间要么是空的(0),要么包含增加骑士身体健康的魔法球(正整数)。
为了尽快到达公主,骑士决定只会每次向右或向下移动一步。
写一个函数来确定骑士的最低初始健康点数,以便他能够拯救公主。
详见:https://leetcode.com/problems/dungeon-game/description/
Java 实现:
方法一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Solution { public int calculateMinimumHP( int [][] dungeon) { int row = dungeon.length; int col = dungeon[ 0 ].length; dungeon[row - 1 ][col - 1 ] = Math.max( 1 - dungeon[row - 1 ][col - 1 ], 1 ); for ( int i = col - 2 ; i >= 0 ; i--) { dungeon[row - 1 ][i] = Math.max(dungeon[row - 1 ][i + 1 ] - dungeon[row - 1 ][i], 1 ); } for ( int i = row - 2 ; i >= 0 ; i--) { dungeon[i][col - 1 ] = Math.max(dungeon[i + 1 ][col - 1 ] - dungeon[i][col - 1 ], 1 ); } for ( int i = row - 2 ; i >= 0 ; i--) { for ( int j = col - 2 ; j >= 0 ; j--) { int down = Math.max(dungeon[i + 1 ][j] - dungeon[i][j], 1 ); int right = Math.max(dungeon[i][j + 1 ] - dungeon[i][j], 1 ); dungeon[i][j] = Math.min(down, right); } } return dungeon[ 0 ][ 0 ]; } } |
方法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Solution { public int calculateMinimumHP( int [][] dungeon) { int m = dungeon.length, n = dungeon[ 0 ].length; int [] dp= new int [n + 1 ]; Arrays.fill(dp,Integer.MAX_VALUE); dp[n - 1 ] = 1 ; for ( int i = m - 1 ; i >= 0 ; --i) { for ( int j = n - 1 ; j >= 0 ; --j) { dp[j] = Math.max( 1 , Math.min(dp[j], dp[j + 1 ]) - dungeon[i][j]); } } return dp[ 0 ]; } } |
参考:https://www.cnblogs.com/grandyang/p/4233035.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步