1. 程式人生 > 遊戲 >戀愛養成《魔法使之夜》2022年登陸NS和PS4平臺

戀愛養成《魔法使之夜》2022年登陸NS和PS4平臺

一些惡魔抓住了公主(P)並將她關在了地下城的右下角。地下城是由M x N 個房間組成的二維網格。我們英勇的騎士(K)最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。

騎士的初始健康點數為一個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。

有些房間由惡魔守衛,因此騎士在進入這些房間時會失去健康點數(若房間裡的值為負整數,則表示騎士將損失健康點數);其他房間要麼是空的(房間裡的值為 0),要麼包含增加騎士健康點數的魔法球(若房間裡的值為正整數,則表示騎士將增加健康點數)。

為了儘快到達公主,騎士決定每次只向右或向下移動一步。

編寫一個函式來計算確保騎士能夠拯救到公主所需的最低初始健康點數。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/dungeon-game
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

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][n];

        dp[m - 1][n - 1] = dungeon[m - 1][n - 1] < 0 ? 1 - dungeon[m - 1][n - 1] : 1;

        for (int i = n - 2; i >= 0; --i) {
            dp[m - 1][i] = dungeon[m - 1][i] < 0 ? dp[m - 1][i + 1] - dungeon[m - 1][i] :
                    Math.max(dp[m - 1][i + 1] - dungeon[m - 1][i], 1);
        }

        for (int i = m - 2; i >= 0; --i) {
            dp[i][n - 1] = dungeon[i][n - 1] < 0 ? dp[i + 1][n - 1] - dungeon[i][n - 1] : Math.max(dp[i + 1][n - 1] - dungeon[i][n - 1], 1);
            for (int j = n - 2; j >= 0; --j) {
                int minNext = Math.min(dp[i + 1][j], dp[i][j + 1]);
                dp[i][j] = dungeon[i][j] < 0 ? minNext - dungeon[i][j] : Math.max(minNext - dungeon[i][j], 1);
            }
        }

        return dp[0][0];
    }
}
心之所向,素履以往 生如逆旅,一葦以航