读完本文,可以去力扣解决如下题目:174.地下城游戏(Hard)
「魔塔」是一款经典的地牢类游戏,碰怪物要掉血,吃血瓶能加血,你要收集钥匙,一层一层上楼,最后救出美丽的公主。
现在手机上仍然可以玩这个游戏:

嗯,相信这款游戏承包了不少人的童年回忆,记得小时候,一个人拿着游戏机玩,两三个人围在左右指手画脚,这导致玩游戏的人体验极差,而左右的人异常快乐
力扣第 174 题是一道类似的题目,我简单描述一下:
输入一个存储着整数的二维数组grid,如果grid[i][j] > 0,说明这个格子装着血瓶,经过它可以增加对应的生命值;如果grid[i][j] == 0,则这是一个空格子,经过它不会发生任何事情;如果grid[i][j] < 0,说明这个格子有怪物,经过它会损失对应的生命值。
现在你是一名骑士,将会出现在最上角,公主被困在最右下角,你只能向右和向下移动,请问骑士的初始生命值至少为多少,才能成功救出公主?
换句话说,就是问你至少需要多少初始生命值,能够让骑士从最左上角移动到最右下角,且任何时候生命值都要大于 0。
函数签名如下:
int calculateMinimumHP(int[][] grid);
比如题目给我们举的例子,输入如下一个二维数组grid,用K表示骑士,用P表示公主:

算法应该返回 7,也就是说骑士的初始生命值至少为 7 时才能成功救出公主,行进路线如图中的箭头所示。
上篇文章 最小路径和 写过类似的问题,问你从左上角到右下角的最小路径和是多少。
我们做算法题一定要尝试举一反三,感觉今天这道题和最小路径和有点关系对吧?
想要最小化骑士的初始生命值,是不是意味着要最大化骑士行进路线上的血瓶?是不是相当于求「最大路径和」?是不是可以直接套用计算「最小路径和」的思路?
但是稍加思考,发现这个推论并不成立,吃到最多的血瓶,并不一定就能获得最小的初始生命值。
比如如下这种情况,如果想要吃到最多的血瓶获得「最大路径和」,应该按照下图箭头所示的路径,初始生命值需要 11:

但也很容易看到,正确的答案应该是下图箭头所示的路径,初始生命值只需要 1:

所以,关键不在于吃最多的血瓶,而是在于如何损失最少的生命

本文以魔塔游戏为背景,介绍了如何运用动态规划算法解决力扣174题——地下城游戏。文章指出,最大化血瓶并不等同于最小化初始生命值,关键在于最小化损失的生命值。通过反向思考,重新定义dp函数,找到了正确状态转移方程,揭示了解题核心。
最低0.47元/天 解锁文章
1513

被折叠的 条评论
为什么被折叠?



