174地下城游戏

题目: 一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。为了尽快到达公主,骑士决定每次只向右或向下移动一步。

来源: https://leetcode-cn.com/problems/dungeon-game/

法一: 自己的错误代码

思路: 这个问题等价于求每条路径中和的最小值,再求最小值中的最大值,通过观察一条路径[-2,-5,10,30,-5],如果是自下而上求和,求最小值的话结果是-5,是无法得到正确结果的,而用自上而下求解的方法可以,但是自上而下求解时, 每次记录的当前和和之前和的最小值,但是局部的最优解无法保证是全局的最优解,但仔细分析自下而上的方法可以改进,每次只需关心当前位置需要多少健康点数,这样的局部最优解,即全局最优解法.

如下这种情况,自上而下的方法无法解决.根本原因是局部最优不是全局最优.

from typing import List
class Solution:
    def calculateMinimumHP(self, dungeon: List[List[int]]) -> int:
        # 行数,列数
        r, c = len(dungeon), len(dungeon[0])
        # 直接在原数据上修改,先计算第一行和第一列
        # 第一项为路径的和,第二项为路径和的最小值
        dungeon[0][0] = (dungeon[0][0],dungeon[0][0])
        for i in range(1,r):
            k = dungeon[i][0] + dungeon[i-1][0][0]
            dungeon[i][0] = (k, min(k,dungeon[i-1][0][1]))
        for j in range(1,c):
            k = dungeon[0][j] + dungeon[0][j-1][0]
            dungeon[0][j] = (k, min(k,dungeon[0][j-1][1]))
        for p in range(1,r):
            for q in range(1,c):
                # 前一列的数
                m = dungeon[p][q-1]
                # 上一行的数
                n = dungeon[p-1][q]
                if min(m[0] + dungeon[p][q], m[1]) > min(n[0] + dungeon[p][q], n[1]):
                    dungeon[p][q] = (dungeon[p][q-1][0] + dungeon[p][q], min(m[0] + dungeon[p][q], m[1]))
                else:
                    dungeon[p][q] = (dungeon[p-1][q][0] + dungeon[p][q], min(n[0] + dungeon[p][q], n[1]))
                print(dungeon[p][q])
        print(dungeon)
        return 1 if dungeon[-1][-1][1] > 0 else -dungeon[-1][-1][1]+1
if __name__ == '__main__':
    duixiang = Solution()
    a = duixiang.calculateMinimumHP([[1,-3,3],[0,-2,0],[-3,-3,-3]])
    print(a)
View Code

法二: 正确代码

https://leetcode-cn.com/problems/dungeon-game/solution/dong-tai-gui-hua-by-powcai-8/

猜你喜欢

转载自www.cnblogs.com/xxswkl/p/12093976.html
今日推荐