[LeetCode] 174ダンジョンゲーム

トピックへのリンク:https://leetcode-cn.com/problems/dungeon-game/

件名の説明:

いくつかの悪魔は王女(P)をつかむと、ダンジョンの右下隅に彼女をロック。ダンジョンは、室から成るM×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])

ボーダーは一の選択肢であるため、国境を検討する(下向きのいずれか、または右へ)

コードは以下の通りであります:

class Solution:
    def calculateMinimumHP(self, dungeon: List[List[int]]) -> int:
        row = len(dungeon)
        col = len(dungeon[0])
        dp = [[0] * col for _ in range(row)]
        # 初始化 右下角最少血量
        dp[-1][-1] = max(1 - dungeon[-1][-1], 1)
        # 行
        for i in range(col - 2, -1, -1):
            dp[-1][i] = max(1, dp[-1][i + 1] - dungeon[-1][i])
        # 列
        for i in range(row - 2, -1, -1):
            dp[i][-1] = max(1, dp[i + 1][-1] - dungeon[i][-1])
        #print(dp)
        for i in range(row - 2, -1, -1):
            for j in range(col - 2, -1, -1):
                dp[i][j] = max(min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j], 1)
        return dp[0][0]

おすすめ

転載: www.cnblogs.com/powercai/p/11328813.html