174. 地下城游戏(逐句解释代码)

61 篇文章 0 订阅
package LeetCode.OneToFiveHundred;

public class OneHundredAndSeventhFour {
    // 记忆每次计算之后最小值
    int[][] memo;
    public int calculateMinimumHP(int[][] dungeon) {
        int m = dungeon.length, n = dungeon[0].length;
        memo = new int[m][n];
        return dfs(dungeon, m, n, 0, 0);
    }
    // 我们只需要计算每次向下走或者向右走需要的最小的血量,除了在边界的时候
    private int dfs(int[][] dungeon,int m,int n,int i,int j){
        // 终止条件
        if (i == m - 1 && j == n - 1) return Math.max(1 - dungeon[i][j], 1);
        // 如果这块已经计算过了,直接跳过
        if (memo[i][j] > 0) return memo[i][j];
        // 当在边界的时候
        int min = 0;
        if (i == m - 1)
            min = Math.max(dfs(dungeon, m, n, i, j + 1) - dungeon[i][j],1);
        else if (j == n - 1)
            min = Math.max(dfs(dungeon, m, n, i + 1, j) - dungeon[i][j],1);
        // 要考虑血量最低为 1,并且必定是第一格开始,所以第一格需要的血量是必须要的
        // 然后计算后面所有的路径的需要的最小的生命值
        else min = Math.max(
                Math.min(dfs(dungeon, m, n, i + 1, j),dfs(dungeon, m, n, i, j + 1)) - dungeon[i][j]
                ,1);
        return memo[i][j] = min;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值