難度:困難
2020/7/12每日一題打卡√
題目描述
解題思路
這個月好多動態規劃的題,這道題也長得就很動態規劃,每一步都跟前一步有關。
但是這個不能像普通的那樣從左上角走到右下角,因為這樣的法沒法得到最小值,因為後面會出現什麼數字,正數還是負數是無法預知的。正確的做法是從右下角元素開始,依次計算到達這個位置需要的健康點數最小值,然後遞推到左上角開始元素。
以題目例子 -2 -3 3
-5 -10 1
10 30 -5 為例,首先看-5,因為扣除後健康點必須大於0,所以要想順利救出公主,進入這個格仔的時候健康點必須大於等於6,所以這個點就是6;
然後這個位置可以是從上面來,也可以是從左邊來,先初始化最右邊那列:1的位置,要加上1後大於等於6,所以進到這個位置必須大於等於5,取最小值就是5;3這個位置,同理應該是2;
初始化最下面那一行,有個需要注意的細節就是,如果是正數,那麼進入需要的健康點是多少。需要進行比較,最小肯定是1,如果加上當前正數之後大於前乙個需要的健康點,比如30,大於最後乙個位置需要的6,那麼到這點的時候只要滿足最低要求1就可以了。變成**就是
dp[m-1][i] = math.max(1,dp[m-1][i+1] - dungeon[m-1][i]);
/*
* 174. 地下城遊戲
* 2020/7/12每日一題打卡
* dp[i][j]表示這個地方需要的最小能量值,從右下角往上倒推
*/public
intcalculateminimumhp
(int
dungeon)
for(
int i = n-
2; i >=
0; i--
)//從右下角往左上角填表
174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...
174 地下城遊戲
174.地下城遊戲 一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有...
174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...