Leetcode--174. 地下城游戏

一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。

骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

为了尽快到达公主,骑士决定每次只向右或向下移动一步。

 

编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。

例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7。

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

说明:

骑士的健康点数没有上限。

任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。

 

这题想了两天,最后也没搞出来,看了大佬的思路,才会的。。。。

这道题意思就是从左上角如何到右下角,只能向右,向下,在这之间有加血,有扣血,如何初始血量使得正好到达。

其实我们可以倒过来想。从右下角保持多少血量能到达左上角。

我们用 dp[i][j]表示在i,j位置最少需要的血量

动态方程:dp[i][j] = max(1, min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j])

最后一行和最后一列做特殊处理

题中给的案例是:

-2  -3     3 

-5  -10   1

10  30   -5

那么从最后一点开始推测,最后一点需要6点血才可以

那么他上面那一行的1处因为可以加一点血,所以到那有五点血就可以

最后推导出来各点的血量就是:

7   5   2

6   11  5

1   1   6

提交的代码:

class Solution {
    public 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+java.lang.Math.abs(dungeon[m-1][n-1]);
        }
        else
        {
            dp[m-1][n-1]=1;
        }
        for(i=m-1;i>=0;i--)
        {
            for(j=n-1;j>=0;j--)
            {
                if(i==m-1&&j!=n-1)
                {
                    dp[i][j] = java.lang.Math.max(1,dp[i][j+1]-dungeon[i][j]);
                }
                else if(i!=m-1&&j==n-1)
                {
                    dp[i][j] = java.lang.Math.max(1,dp[i+1][j]-dungeon[i][j]);
                }
                else if(i!=m-1&&j!=n-1)
                {
                    dp[i][j] = java.lang.Math.max(1,java.lang.Math.min(dp[i+1][j],dp[i][j+1])-dungeon[i][j]);
                }
            }
            
        }
        return 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+java.lang.Math.abs(dungeon[m-1][n-1]);
        }
        else
        {
            dp[m-1][n-1]=1;
        }
        for(i=m-1;i>=0;i--)
        {
            for(j=n-1;j>=0;j--)
            {
                if(i==m-1&&j!=n-1)
                {
                    dp[i][j] = java.lang.Math.max(1,dp[i][j+1]-dungeon[i][j]);
                }
                else if(i!=m-1&&j==n-1)
                {
                    dp[i][j] = java.lang.Math.max(1,dp[i+1][j]-dungeon[i][j]);
                }
                else if(i!=m-1&&j!=n-1)
                {
                    dp[i][j] = java.lang.Math.max(1,java.lang.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}};
        //int[][] nums = {{0,0,0},{1,1,-1}};
        //int[][] nums = {{-200}};
        System.out.println(calculateMinimumHP(nums));
    }
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[jQuery] 判断复选框checkbox是否选中checked

返回值是true/false method 1: $("#register").click(function(){if($("#accept").get(0).checked){alert($("#accept").get(0).checked);}else{alert($("#accept").get(0).checked);}});// 其中accept为复选框的id. 或者可以替换为: …

Nature:2020年10大科学发现

文章来源&#xff1a;新浪探索在2020年即将结束之际&#xff0c;《自然》&#xff08;Nature&#xff09;杂志盘点了今年发表的科学新闻和研究观点&#xff0c;从中选出了十项最为重大的科学发现&#xff0c;既包括新冠病毒研究、压力如何导致白发、HIV治疗等医学方面的研究&am…

php mysql上传多张图片_PHP实现一次性多张图片上传功能

原标题&#xff1a;PHP实现一次性多张图片上传功能最近遇到一个需求&#xff0c;就是多张图片上传&#xff0c;按住Ctrl键能选择多张图片一次性上传&#xff0c;上传成功后数据库保存图片的路径及图片原来的文件名。该功能一般在比较成熟的内容编辑器插件中有&#xff0c;今天特…

Leetcode--20. 有效的括号

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示…

【2018.6.7】阶段总结

颓废了好久-.- 不记得从什么时候开始的了吧- 1. 好像是去年初赛翻车&#xff1f;&#xff09;&#xff09;归于以外好像也是我不对&#xff0c;&#xff0c;&#xff0c;总之很多&#xff0c;&#xff0c;不对的地方吧&#xff0c;&#xff0c;&#xff0c;我&#xff0c;&am…

车联网支持实现无人驾驶的思考

来源&#xff1a;机器学习研究组订阅号/ 导读 /无人驾驶是车辆作为运载工具智能化、网联化发展的核心应用功能&#xff0c;也是车联网、智慧交通产业发展的核心应用服务。网联无人驾驶则是在车辆智能化基础上&#xff0c;通过车联网实现车与车、车与路等的互联和信息交互&#…

mysql的代码需要保存吗_php向Mysql数据库保存数据的代码

php向Mysql数据库保存数据的代码PHP如何向MySQL数据库中写入数据你知道吗&#xff1f;你对PHP向MySQL数据库中写入数据了解吗&#xff1f;下面是小编为大家带来的php向Mysql数据库保存数据的代码&#xff0c;欢迎阅读。php向Mysql数据库保存数据的代码PHP向MySQL数据库中写入数…

Leetcode--150. 逆波兰表达式求值

根据逆波兰表示法&#xff0c;求表达式的值。 有效的运算符包括 , -, *, / 。每个运算对象可以是整数&#xff0c;也可以是另一个逆波兰表达式。 说明&#xff1a; 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说&#xff0c;表达式总会得出有效数值且不存…

简论重大科学发现诞生的时机

来源&#xff1a;秦四清科学网博客。链接地址&#xff1a;http://blog.sciencenet.cn/blog-575926-1263364.html 纵观科学史&#xff0c;几乎每一项重大科学发现诞生的时机需要&#xff1a;&#xff08;1&#xff09;当时已具备足够的知识和资料储备&#xff1b;&#xff08;2&…

数据库接口使用示例

考虑到我们的接口文档可能不是很清晰&#xff0c;昨天对接的时候也发现UI人员对我们的接口逻辑不太理解&#xff0c;所以这里写几个典型范例。虽然对接也快对接完了&#xff08;逃&#xff0c;但是这样至少免得以后忘记了。 &#xff08;注&#xff1a;这里的代码都测试过&…

python pip gpl_python pip怎么更新包

1、pip下载安装1.1 pip下载进入https://pypi.python.org/pypi/pip&#xff0c;下载 .tar.gz压缩包1.2 Linux安装pip# tar -xzvf pip-1.5.4.tar.gz 解压# cd pip-1.5.4 进入解压文件# python setup.py install 安装1.3 升级pippython -m pip install…

Leetcode--78. 子集

给定一组不含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入: nums [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 思路&…

人工智能皇冠上的明珠:自然语言处理简介、最新进展、未来趋势

来源&#xff1a;图灵人工智能 编辑&#xff1a;TJUNLP 自然语言处理&#xff08;Nature Language Processing&#xff0c;NLP&#xff09;被誉为“人工智能皇冠上的明珠”&#xff0c;一方面表明了它的重要性&#xff0c;另一方面也显现出了它的技术难度。本文整理了自然语言…

realloc 用方法

realloc 用方法 void* realloc(void*, n) 根据n的大小&#xff0c;如果n比较小&#xff0c;就沿用原来的内存地址&#xff08;也就是返回的地址就是原来的地址&#xff09;&#xff0c;在原来地址的内存空间的最后面&#xff0c;加上n大小的内存空间&#xff1b;如果n比较大&am…

Leetcode--90. 子集Ⅱ

给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 思路&#xff1a;相比第78题&…

Yoshua Bengio:深度学习的未来需要“探索高级认知的归纳偏置”

来源&#xff1a;AI科技评论 编译&#xff1a;Mr Bear本文介绍了Yoshua Bengio及其学生Anirudh Goyal近期发表的一篇论文&#xff0c;该论文围绕“归纳偏置”概念&#xff0c;展开了对当下人工智能研究现状的讨论&#xff0c;并提出了富有启发性的观点&#xff1a;不同的深度学…

毕业季

真高兴。 一个懦弱了大学四年的人&#xff0c;竟然破天荒地跑去跟喜欢的女孩子表白。 他依然害怕知道结果&#xff0c;但他不后悔。 转载于:https://www.cnblogs.com/can-i-do/p/9164173.html

头发剪短了要快速生发_怎样生发效果最好最快?四个方法快速长出头发!

脱发问题导致很多人头发稀少、头发细软油腻&#xff0c;这些症状&#xff0c;让患者时常感到十分的痛苦&#xff0c;因为他们每天都要面临被调侃和取笑的尴尬&#xff0c;不仅个人形象全无&#xff0c;更是饱受严重的自卑心理&#xff0c;甚至因为脱发问题&#xff0c;总是给人…

AI求解薛定谔方程,兼具准确度和计算效率,登上《自然-化学》

来源&#xff1a;机器学习研究组订阅号即使并非物理学界人士&#xff0c;我们也对薛定谔这个名字并不陌生&#xff0c;比如「薛定谔的猫」。著名物理学家埃尔温 薛定谔是量子力学奠基人之一&#xff0c;他在 1926 年提出的薛定谔方程&#xff08;Schrdinger equation&#xff…

老鼠喝药水

已知有11瓶无色无味的药水&#xff0c;其中有1瓶有毒并且其他10瓶无毒&#xff0c;喝了有毒的药水后会在23个小时之后的一个小时内毒发身亡&#xff08;死亡时间在1个小时内随机&#xff09;。现在有4只老鼠&#xff0c;如何在一天之内(第二天)找出这瓶有毒的药水&#xff1f; …