ダンジョンゲームとして記述されています。 T 彼のダンジョンは、2DグリッドにレイアウトされたM×Nの部屋で構成されています。 私たちの勇敢な騎士(K)は、当初は左上の部屋 に位置し、王女を救うためにダンジョンを通って戦う必要がありました。ダンジョンゲームソリューションの説明
ナイトの初期ヘルスポイントは正の整数で表されます。 ヘルスポイントが0以下になると、すぐに死ぬ。
部屋の中には悪魔によって守られているものもありますので、騎士はこれらの部屋に入ると健康(負の整数)を失います。 他の部屋は空(0)か騎士の健康状態を増やす魔法の玉(正の整数)を含んでいます。
できるだけ早く王女に届くように、 騎士は各ステップで右または下にのみ移動することを決めます。
騎士の最小初期状態を決定する機能を書く。 プリンセスを救助できるようにする。
たとえば、以下のダンジョンを仮定すると、最初の健康状態は です.RIGHT-> RIGHT-> DOWN-> DOWNの最適なパスをたどった場合、ナイトは少なくとも7でなければなりません。
注:
騎士の健康状態には上限がありません。 部屋には、騎士が と入力した最初の部屋と、プリンセスが投獄されている右下の部屋であっても、脅威やパワーアップが含まれることがあります。
例:
dungeon = [[-2, -3, 4],
[-6, -15, 0],
[10, 25, -6]]
回答:8
コードソリューションは、次のとおりです。
def dungeonGame(dungeon):
dp = [float("inf") for _ in dungeon[0]]
dp[-1] = 1
for i in reversed(range(len(dungeon))):
dp[-1] = max(dp[-1] - dungeon[i][-1], 1)
for j in reversed(range(len(dungeon[i]) - 1)):
min_HP_on_exit = min(dp[j], dp[j + 1])
dp[j] = max(min_HP_on_exit - dungeon[i][j], 1)
return dp[0]
誰かが上記の解決策が機能しているか説明できますか?提供されているサンプルを使ってdpのみをlen 3にするのはなぜですか?開始と終了の部屋を除いて、3つのステップしか必要ないので、それはありますか?なぜ隣接するdpの最小値を得てから最大値を得るのですか?また、最後の列が考慮されていないように見えるのは、jが1になるダンジョン[i] [j](与えられた行列の例)です。私は解決策がうまく書かれていることを知っています。すべての道をどのように考慮しているかを理解しようとしています。