Leetcode--174. 地下城游戏
发布日期:2021-04-30 21:02:02 浏览次数:109 分类:精选文章

本文共 1575 字,大约阅读时间需要 5 分钟。

骑士必须从左上角移动到右下角的公主所在房间,每次只能向右或向下移动。网格中的房间可能会影响骑士的健康点数:加血房间会增加,扣血房间会扣减。初始健康点数必须足够高,以确保骑士能够成功拯救公主。

为了计算最低初始健康点数,我们可以使用动态规划。设dp[i][j]表示到达房间(i, j)所需的最低初始健康点数。动态规划的递推公式为:

dp[i][j] = max(1, min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j])

处理边界条件时,如果公主所在的房间值为负数,则将其调整为至少1,以确保骑士能够到达。

从右下角开始逆向计算,填充dp表格,最后返回dp[0][0]即为所需的最低初始健康点数。

完整代码如下:

public class Solution174 {    public static int calculateMinimumHP(int[][] dungeon) {        int m = dungeon.length;        int n = dungeon[0].length;        int[][] dp = new int[m][n];        int i, j;        // 处理公主所在的房间        if (dungeon[m - 1][n - 1] < 0) {            dp[m - 1][n - 1] = 1 + Math.abs(dungeon[m - 1][n - 1]);        } else {            dp[m - 1][n - 1] = 1;        }        // 从右下角开始向上和向左填充dp表        for (i = m - 1; i >= 0; i--) {            for (j = n - 1; j >= 0; j--) {                if (i == m - 1 && j != n - 1) {                    dp[i][j] = Math.max(1, dp[i][j + 1] - dungeon[i][j]);                } else if (j == n - 1 && i != m - 1) {                    dp[i][j] = Math.max(1, dp[i + 1][j] - dungeon[i][j]);                } else if (i != m - 1 && j != n - 1) {                    dp[i][j] = Math.max(1, Math.min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j]);                }            }        }        return dp[0][0];    }    public static void main(String[] args) {        int[][] nums = { { -2, -3, 3 }, { -5, -10, 1 }, { 10, 30, -5 } };        System.out.println(calculateMinimumHP(nums));    }}

代码解释:

  • 初始化dp表格并处理右下角的房间。
  • 从右下角开始逆向填充dp表格,计算每个房间的最低初始健康点数。
  • 返回dp[0][0]即为所需的最低初始健康点数。
  • 通过这种方法,可以高效地计算出骑士拯救公主所需的最低初始健康点数。

    上一篇:Leetcode--994. 腐烂的橘子(java)
    下一篇:创建Oracle数据库表空间,授权用户

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2026年06月17日 05时08分00秒