题目描述:
一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。
骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。
有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。
为了尽快到达公主,骑士决定每次只向右或向下移动一步。
编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。
例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7。
-2 (K) -3 3
-5 -10 1
10 30 -5 (P)
说明:
骑士的健康点数没有上限。
任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。
思路:
动态规划题目要是想明白了其实很简单,但是如果想不明白就会很困难(好吧,所有的题目都是这样......)。
不多解释,直接上代码,有疑问的地方评论区见哦!!
这道题LeetCode上标注“Hard”,但是如果想清楚了其实不难,我就是一把过,呵呵!!
1 class Solution { 2 public int calculateMinimumHP(int[][] dungeon) { 3 if (dungeon.length==0||dungeon[0].length==0) { 4 return 0; 5 } 6 int row=dungeon.length; 7 int col=dungeon[0].length; 8 int[][] dp=new int[row][col]; 9 dp[row-1][col-1]=Math.max(1,1-dungeon[row-1][col-1]); 10 for (int i=row-2; i>=0; i--) { 11 dp[i][col-1]=Math.max(dp[i+1][col-1]-dungeon[i][col-1],1); 12 } 13 for (int i=col-2; i>=0; i--) { 14 dp[row-1][i]=Math.max(dp[row-1][i+1]-dungeon[row-1][i],1); 15 } 16 for (int i=row-2; i>=0; i--) { 17 for (int j=col-2; j>=0; j--) { 18 dp[i][j]=Math.max(Math.min(dp[i][j+1],dp[i+1][j])-dungeon[i][j],1); 19 } 20 } 21 return dp[0][0]; 22 } 23 }
欢迎评论,共同进步!!