地牢遊戲描述爲:地牢遊戲解決方案的解釋
惡魔抓獲了公主(P),並在地牢的右下角囚禁她 。 T 他的地牢由二維網格佈置的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上獲得最小值,然後是最大值?另外,自從地牢[i] [j]以來,最後一列似乎沒有被考慮到,其中j僅上升到1(以給定示例矩陣)。我知道解決方案寫得很好,只是想了解它如何考慮所有的路徑。