地下城遊戲
難度困難
一些惡魔抓住了公主(p)並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士(k)最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。
騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。
有些房間由惡魔守衛,因此騎士在進入這些房間時會失去健康點數(若房間裡的值為負整數,則表示騎士將損失健康點數);其他房間要麼是空的(房間裡的值為 0),要麼包含增加騎士健康點數的魔法球(若房間裡的值為正整數,則表示騎士將增加健康點數)。
為了盡快到達公主,騎士決定每次只向右或向下移動一步。
編寫乙個函式來計算確保騎士能夠拯救到公主所需的最低初始健康點數。
例如,考慮到如下布局的地下城,如果騎士遵循最佳路徑 右 -> 右 -> 下 -> 下,則騎士的初始健康點數至少為7。
說明:
騎士的健康點數沒有上限。
任何房間都可能對騎士的健康點數造成威脅,也可能增加騎士的健康點數,包括騎士進入的左上角房間以及公主被監禁的右下角房間。
思路:
本題的是找到最小的最低初始健康點數,如果從頭開始找是受到後面的影響的,不好找。如果從後面往前找,那更容易找一點。
先這樣想,公主所在房間總共有3種情況,負數,0,正數;那麼對應這3種情況,騎士在到達公主房間時對應的最低初始健康點數分別為 1 + |負數|,1,1(不知道小夥伴們是否容易理解)。
因為最後一行只能通過向右到達公主所在點,那麼往前推,最後一行只能向左邊,那麼最後一行與公主所在點相鄰的那個點最低初始健康點數該怎麼計算呢?
該點也有3種情況,如果是0的話,那麼該點的值就等於上乙個點的;如果是負數的話,那麼該點的值 = 上乙個的值 + | 該點的值 |;如果是正數的話,那麼該點的值 = max(上乙個的值 - 該點的值 ,1)
最後一列情況差不多吧。
其他的地方需要看下邊和後邊。
class
solution
// 計算最後一列
for(int i = m -
2; i >=
0; i--
)// 其他情況
for(int i = n -
2; i >=
0; i--)}
return dungeon[0]
[0];
}}
LeetCode 174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...
LeetCode174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...
Leetcode 174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...