LeetCode 174. 地下城游戏

LeetCode 174. 地下城游戏

一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。
我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。
骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。
有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为
0),
要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。
为了尽快到达公主,骑士决定每次只向右或向下移动一步。
编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。


题解:首先画重点,能够保证救到公主,那么就要保证到达右下角 时的健康点数至少为0
(我他么辛辛苦苦对抗恶魔救公主,得看一眼才能死吧),但是公主看不下去了。
说你在那等着,我过去吧。

动态规划
这道题我我们对于初始的血量是未知数,不确定,唯一确定的就是在到达右下角时的血量是为1的。
既然这样,那么我们就反推过去(勇猛的公主),还是老套路,‘保存上一步的状态,避免重复计算’
一定要记住这句话,由于只能向下和向右移动,计算每一格所需的最小值,并且最小值为1(不然就挂掉),所以状态就是
dp[i][j]=max(dungeon-min(dp[i+1][j],dp[i][j+1]),1)


public class calculateMinimumHP {
     
    public static void main(String[] args) {
     

    }
    public static int calculateMinimumHP(int[][] dungeon){
     
        int n=dungeon.length,m=dungeon[0].length;
        int[][] dp=new int[n+1][m+1];
        for (int i=0;i<=n;i++){
     
            Arrays.fill(dp[i],Integer.MAX_VALUE);
        }
        dp[n][m-1]=dp[n-1][m]=1;
        for (int i = n - 1; i >= 0; --i) {
     
            for (int j = m - 1; j >= 0; --j) {
     
                int minn = Math.min(dp[i + 1][j], dp[i][j + 1]);
                dp[i][j] = Math.max(minn - dungeon[i][j], 1);
            }
        }
        return dp[0][0];
    }

}

你可能感兴趣的:(动态规划,leetcode,java,动态规划)