174. Dungeon Game

https://leetcode.com/problems/dungeon-game/description/

  • 乍一看铝侵,這個問題和"Maximum/Minimum Path Sum"問題很相似堕澄。然而侠讯,具有全局最大HP(生命值)收益的路徑并不一定可以保證最小的初始HP王浴,因為題目中具有限制條件:HP不能≤0榆综。例如您觉,考慮下面的兩條路徑:0 -> -300 -> 310 -> 0 和 0 -> -1 -> 2 -> 0。這兩條路徑的凈HP收益分別是-300 + 310 = 10 與 -1 + 2 = 1拖吼。第一條路徑的凈收益更高,但是它所需的初始HP至少是301这吻,才能抵消第二個房間的-300HP損失吊档,而第二條路徑只需要初始HP為2就可以了。
  • 幸運的是唾糯,這個問題可以通過“table-filling”(表格填充)動態(tài)規(guī)劃算法解決怠硼,與其他"grid walking"(格子行走)問題類似:

思路

騎士向右或者向下走鬼贱,如果血量小于0就死掉了,這會使得計算變得很復(fù)雜香璃。如果我們從后往前看这难,從最后一個格子逆推回去,就會簡單很多葡秒。每個格子可以是它下方或者右方的格子逆推回來姻乓,那么要讓其實的血量最少,我們則要保證逆推的每一步都處于活著的狀態(tài)眯牧,且選擇活著的狀態(tài)中蹋岩,血量較小的那一種。假設(shè)health[i][j]表示點i和j的血量学少,dungeon[i][j]表示走到i和j要扣除的血量剪个。如果從下方逆推回上面,則血量為health[i][j] = health[i + 1][j] - dungeon[i][j]版确,但要考慮扣囊,如果該格子如果扣血扣太多的,則這樣相減血量會成為負(fù)數(shù)绒疗,說明騎士就已經(jīng)死了侵歇,這樣的話我們要保證扣完血后騎士還活著,則該點的血量就應(yīng)該為1忌堂。所以其實是health[i][j] = Math.max(health[i + 1][j] - dungeon[i][j], 1)盒至。同理,如果從右邊逆推回來士修,則health[i][j] = Math.max(health[i][j] - dungeon[i][j + 1], 1)枷遂。最后,我們在這兩個逆推的值中棋嘲,取較小的那個就行了酒唉。

注意

  • 由于最下面一行和最右面一列比較特殊,只有一種逆推方法沸移,所以我們要先單獨處理一下痪伦。
  • 最右下角那個節(jié)點沒有待逆推的節(jié)點,所以我們假設(shè)其逆推節(jié)點的血量為1雹锣。
public class Solution {
    public int calculateMinimumHP(int[][] dungeon) {
        if(dungeon == null || dungeon.length == 0) return 1;
        int m = dungeon.length;
        int n = dungeon[0].length;
        int[][] health = new int[m][n];
        health[m - 1][n - 1] = Math.max(1 - dungeon[m - 1][n - 1], 1);
        // 逆推最后一列的血量
        for(int i = m - 2; i >= 0; i--){
            health[i][n - 1] = Math.max(health[i + 1][n - 1] - dungeon[i][n - 1], 1);
        }
        // 逆推最后一行的血量
        for(int j = n - 2; j >= 0; j--){
            health[m - 1][j] = Math.max(health[m - 1][j + 1] - dungeon[m - 1][j], 1);
        }
        // 對于每個節(jié)點网沾,從其下方和右方逆推回來
        for(int i = m - 2; i >= 0; i--){
            for(int j = n - 2; j >= 0; j--){
                int down = Math.max(health[i + 1][j] - dungeon[i][j], 1);
                int right = Math.max(health[i][j + 1] - dungeon[i][j], 1);
                health[i][j] = Math.min(down, right);
            }
        }
        return health[0][0];
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蕊爵,隨后出現(xiàn)的幾起案子辉哥,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醋旦,死亡現(xiàn)場離奇詭異恒水,居然都是意外死亡,警方通過查閱死者的電腦和手機饲齐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門钉凌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捂人,你說我怎么就攤上這事御雕。” “怎么了先慷?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵饮笛,是天一觀的道長。 經(jīng)常有香客問我论熙,道長福青,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任脓诡,我火速辦了婚禮无午,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祝谚。我一直安慰自己宪迟,他們只是感情好蔗蹋,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布檩小。 她就那樣靜靜地躺著,像睡著了一般成榜。 火紅的嫁衣襯著肌膚如雪席爽。 梳的紋絲不亂的頭發(fā)上意荤,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音只锻,去河邊找鬼玖像。 笑死,一個胖子當(dāng)著我的面吹牛齐饮,可吹牛的內(nèi)容都是我干的捐寥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼祖驱,長吁一口氣:“原來是場噩夢啊……” “哼握恳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捺僻,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤乡洼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體就珠,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年醒颖,在試婚紗的時候發(fā)現(xiàn)自己被綠了妻怎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡泞歉,死狀恐怖逼侦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腰耙,我是刑警寧澤榛丢,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挺庞,受9級特大地震影響晰赞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜选侨,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一掖鱼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧援制,春花似錦戏挡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洪己,卻和暖如春妥凳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背码泛。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工猾封, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人噪珊。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓晌缘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親痢站。 傳聞我的和親對象是個殘疾皇子磷箕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容