美文网首页
LeetCode 第174题:地下城游戏

LeetCode 第174题:地下城游戏

作者: 放开那个BUG | 来源:发表于2021-05-15 12:25 被阅读0次

1、前言

题目描述

2、思路

这道题咋一看好像直接能套 dfs 的套路把题目做出来,但是到达终点后,最后一个数是要特殊处理的,因为我们需要保证骑士在最后的格子需要活下来,那么最后一个格子需要特殊处理。如果数字为正,那没有什么用,直接返回0就行;如果数字为负,那么需要返回相应需要扣减的血量。

还有就是,普通的棋盘遍历都是求最大或者最小步数之类的,但是这里却行不通,不能单纯的求最大数或者最小的数,因为没啥意义。这题需要求最小消耗量,直接减每一步的消耗,负数直接加;正数直接减,但是减到0需要直接返回0。

3、代码

public class CalculateMinimumHP {

    public int calculateMinimumHP(int[][] dungeon) {
        int m = dungeon.length, n = dungeon[0].length;
        int[][] memo = new int[m][n];
        for (int i = 0; i < memo.length; i++) {
            Arrays.fill(memo[i], -1);
        }
        return dfs(dungeon, 0, 0, memo) + 1;
    }

    private int dfs(int[][] dungeon, int i, int j, int[][] memo) {
        if(i == dungeon.length - 1 && j == dungeon[0].length - 1){
            return dungeon[i][j] >= 0 ? 0 : -dungeon[i][j];
        }

        if(i >= dungeon.length || j >= dungeon[0].length){
            return Integer.MAX_VALUE;
        }

        if(memo[i][j] != - 1){
            return memo[i][j];
        }

        int res = Math.min(dfs(dungeon, i  + 1, j, memo), dfs(dungeon, i, j + 1, memo))  -  dungeon[i][j];
        memo[i][j] = res <= 0 ? 0 : res;

        return memo[i][j];
    }


    public static void main(String[] args) {
        int[][] dungeon = {
                {-1, -5},
                {-4, -3}
        };
        System.out.println(new CalculateMinimumHP().calculateMinimumHP(dungeon));
    }
}

相关文章

网友评论

      本文标题:LeetCode 第174题:地下城游戏

      本文链接:https://www.haomeiwen.com/subject/kcqudltx.html