一些惡魔抓住了公主(p)並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士(k)最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。
騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。
有些房間由惡魔守衛,因此騎士在進入這些房間時會失去健康點數(若房間裡的值為負整數,則表示騎士將損失健康點數);其他房間要麼是空的(房間裡的值為 0),要麼包含增加騎士健康點數的魔法球(若房間裡的值為正整數,則表示騎士將增加健康點數)。
為了盡快到達公主,騎士決定每次只向右或向下移動一步。
編寫乙個函式來計算確保騎士能夠拯救到公主所需的最低初始健康點數。
例如,考慮到如下布局的地下城,如果騎士遵循最佳路徑 右 -> 右 -> 下 -> 下,則騎士的初始健康點數至少為 7。
-2 (k) -3 3
-5 -10 1
10 30 -5 §
說明:騎士的健康點數沒有上限。
任何房間都可能對騎士的健康點數造成威脅,也可能增加騎士的健康點數,包括騎士進入的左上角房間以及公主被監禁的右下角房間。
反向dp,假設騎士找到公主時剩餘生命值為1時,倒推進入時需要的最小生命值
// 地下城遊戲,思路是倒著計算,假設找到公主時,騎士的生命值剩餘為1點時,進入時最少需要多少生命值
intcalculateminimumhp
(vectorint>>
& dungeon)
return veccache[0]
;}if(rownum ==1)
// 單行
return veccache[0]
;}vectorint>>
veccache
(rownum, vector<
int>
(column,-1
));// 快取到每個點所需的最小生命值
veccache[rownum -1]
[column -1]
=max
(surplus, surplus - dungeon[rownum -1]
[column -1]
);findminimumhp
(rownum -
2, column -
1, dungeon, veccache)
;findminimumhp
(rownum -
1, column -
2, dungeon, veccache)
;return veccache[0]
[0];
}void
findminimumhp
(int starty,
int startx, vectorint>>
& dungeon, vectorint>>
&veccache)
// starty開始的行數,startx開始的列數
else
if(startx == column -1)
// 該點位於左邊界,則該點所需最小值由它下邊的結點推算出來
else
if(veccache[starty +1]
[startx]!=-
1&& veccache[starty]
[startx +1]
!=-1)
if(veccache[starty]
[startx]!=-
1)if(startx -
1>=0)
}}
LeetCode 174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...
Leetcode 174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...
leetcode 174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...