一些惡魔抓住了公主(p)並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士(k)最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。
騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。
有些房間由惡魔守衛,因此騎士在進入這些房間時會失去健康點數(若房間裡的值為負整數,則表示騎士將損失健康點數);其他房間要麼是空的(房間裡的值為 0),要麼包含增加騎士健康點數的魔法球(若房間裡的值為正整數,則表示騎士將增加健康點數)。
為了盡快到達公主,騎士決定每次只向右或向下移動一步。
-2 (k)-33
-5-10110
30-5 (p)
編寫乙個函式來計算確保騎士能夠拯救到公主所需的最低初始健康點數。
例如,考慮到如下布局的地下城,如果騎士遵循最佳路徑 右 -> 右 -> 下 -> 下,則騎士的初始健康點數至少為 7。
說明:騎士的健康點數沒有上限。
任何房間都可能對騎士的健康點數造成威脅,也可能增加騎士的健康點數,包括騎士進入的左上角房間以及公主被監禁的右下角房間。
根據題目的描述,這道題目是動態規劃無疑。但是如何建立遞推關係表示式呢?我們令dp[i][j]
表示從(i,j)
出發到公主所在位置所需的最小的初始血量。那麼dp[0][0]+1
即為救出公主所需的最小初始健康值。因為騎士的健康值在任何時候都不能低於1,所以此處加了1。下面我們分析下地推關係。我們知道騎士可以往下走或者往右走。如果\(dungeon[i][j] \ge dp[i][j+1]\),那麼由\((i,j)\rightarrow (i,j+1)\),由\(dungeon[i][j]\)提供的魔法球增加的健康值足夠騎士走到公主所在位置,不需要補給額外的能量。否則,則需要提供額外的健康值\(dp[i][j+1] - dungeon[i][j]\)才足以維持騎士的生命。由\((i,j)\rightarrow (i+1,j)\)也是同理,於是我們有如下的表達
\[dp[i][j] = max(0, min(dp[i+1][j], dp[i][j+1])-dungeon[i][j])
\]上式可以保證在任何時候\(dp[i][j]\ge 0\)。
下面給出**
class solution ;
dp[m-1][n-1] = dungeon[m-1][n-1] >= 0?0:-dungeon[m-1][n-1];
for(int i = m-1; i >= 0; --i)
}return dp[0][0] + 1;
}};
LeetCode 174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...
LeetCode174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...
Leetcode 174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...