Leetcode Dungeon Game Java

The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. The dungeon consists of M x N rooms laid out in a 2D grid. Our valiant knight (K) was initially positioned in the top-left room and must fight his way through the dungeon to rescue the princess.

The knight has an initial health point represented by a positive integer. If at any point his health point drops to 0 or below, he dies immediately.

Some of the rooms are guarded by demons, so the knight loses health (negative integers) upon entering these rooms; other rooms are either empty (0’s) or contain magic orbs that increase the knight’s health (positive integers).

In order to reach the princess as quickly as possible, the knight decides to move only rightward or downward in each step.

Write a function to determine the knight’s minimum initial health so that he is able to rescue the princess.

For example, given the dungeon below, the initial health of the knight must be at least 7 if he follows the optimal path RIGHT-> RIGHT -> DOWN -> DOWN.

-2 (K) -3 3
-5 -10 1
10 30 -5 (P)

Notes:

The knight’s health has no upper bound.
Any room can contain threats or power-ups, even the first room the knight enters and the bottom-right room where the princess is imprisoned.

首先,解释一下这道题的题意:dungeon的意思是地牢的意思。首先有一个很坏的恶魔,抓走了我们美丽的公主,然后又有一个抠脚骑士,不对,勇敢的,要去救公主。公主被囚禁在地牢的右下角,骑士只能从地牢左上角进入,并且只能一路向下或者向右(愚蠢的骑士)。给定的二维数组表示地牢,相应的数字表示骑士掉血或者回血的数目。求骑士进入时的最低血量。注:骑士的血量必须一直>0,否则就真抠脚了。

这道题第一想法,使用一个等大的标记数组,标记骑士到该点的需要的最小血量。从前往后,貌似不是一个很好的选择,所以选择了从后往前,即从右下角向左上角标记

程序如下:

    public int calculateMinimumHP(int[][] dungeon) {
        if(dungeon==null||dungeon.length==0||dungeon[0].length==0)
            return 0;
        int row=dungeon.length-1;
        int col=dungeon[0].length-1;
        int[][] mark=new int[row+1][col+1];
        for(int i=row;i>=0;i--){
            for(int j=col;j>=0;j--){
                if(i==row&&j==col){
                    mark[i][j]=dungeon[i][j]<0?(-dungeon[i][j]):0;
                }else if(i==row){
                    mark[i][j]=(mark[i][j+1]-dungeon[i][j])>0?(mark[i][j+1]-dungeon[i][j]):0;
                }else if(j==col){
                    mark[i][j]=(mark[i+1][j]-dungeon[i][j])>0?(mark[i+1][j]-dungeon[i][j]):0;
                }else {
                    mark[i][j]=Math.min((mark[i][j+1]-dungeon[i][j])>0?(mark[i][j+1]-dungeon[i][j]):0, (mark[i+1][j]-dungeon[i][j])>0?(mark[i+1][j]-dungeon[i][j]):0);
                }
            }
        }
        return mark[0][0]+1;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode是一个面向编程准备面试的在线平台,它提供了各种编程题目来帮助开发人员提高算法和数据结构的能力。下面是一个使用Java进行LeetCode刷题的指南: 1. 熟悉题库:首先,你需要熟悉LeetCode的题库。了解各种类型的题目,比如数组、字符串、链表、树等等,并了解它们对应的解决方法。 2. 制定计划:根据自己的时间和能力安排一个刷题计划,每天或每周刷一定数量的题目。有计划地刷题可以保证你的学习进度。 3. 注重基础:LeetCode要求高效的算法和数据结构知识,所以确保你掌握了一些基本的数据结构和算法,比如数组、链表、栈、队列、二叉树、图等等。 4. 解题过程:当你开始解题时,首先仔细阅读题目描述,并理解问题的要求。然后分析问题,尽量找到一种简单而高效的解决方案。 5. 编码实现:在理解和分析问题之后,使用Java编写代码来解决问题。编写简洁、高效的代码可以提高你的编码能力。 6. 测试和优化:编写测试用例来验证你的代码是否正确,并分析你的代码的时间复杂度和空间复杂度。根据测试结果,进行代码优化以提高性能。 7. 学习他人的解决方案:LeetCode上有很多高手,他们在解决问题时可能采用了一些巧妙的解决方案。阅读和学习他们的代码可以帮助你提高自己的解题能力。 8. 多实践,多思考:不仅仅完成题目,还需要总结经验和教训。多思考为什么这个解决方案是高效的,以及如何在其他类似问题上应用相同的思路。 通过遵循这个LeetCode刷题指南,你可以提高自己的算法和数据结构的能力,为面试做好准备。刷题不仅仅是为了通过面试,更是提升自己的编程技能和思维能力的一种训练。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值