Leetcode 174. Dungeon Game

The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. The dungeon consists of M x N rooms laid out in a 2D grid. Our valiant knight (K) was initially positioned in the top-left room and must fight his way through the dungeon to rescue the princess.

The knight has an initial health point represented by a positive integer. If at any point his health point drops to 0 or below, he dies immediately.

Some of the rooms are guarded by demons, so the knight loses health (negative integers) upon entering these rooms; other rooms are either empty (0's) or contain magic orbs that increase the knight's health (positive integers).

In order to reach the princess as quickly as possible, the knight decides to move only rightward or downward in each step.
原題連接:https://leetcode.com/problems/dungeon-game/description/

思路:
動態(tài)規(guī)劃。
要求英雄從起點(diǎn)出發(fā)最小的血量。
考慮極端情況弹惦,只有一個格子霜威。如果格子值val是負(fù)數(shù)埂淮,則英雄血量至少為1-val寄雀;如果是整數(shù)炒俱,則英雄只需要1點(diǎn)血量保證存活即可巷燥。
考慮2*2的grid赡盘,上面已經(jīng)算出了到達(dá)最后一個格子最少需要的血量,那么結(jié)合grid[0][1]和grid[1][0]缰揪,我們能推出這兩個格子至少需要的血量亡脑。
grid[0][0]可以從01和10推出。
從上面分析邀跃,我們可以用一個二維的life數(shù)組表示從當(dāng)前點(diǎn)走到右下角霉咨,英雄在當(dāng)前點(diǎn)需要的最少血量,最后遞推出的life[0][0]即是所求值拍屑。

public int calculateMinimumHP(int[][] dungeon) {
    if (dungeon == null || dungeon.length == 0 || dungeon[0].length == 0) {
        return 0;
    }

    int m = dungeon.length, n = dungeon[0].length;
    int[][] life = new int[m][n];
    life[m-1][n-1] = dungeon[m-1][n-1] < 0 ? 1-dungeon[m-1][n-1] : 1;
    for (int i = m-2; i >= 0; i--) {
        life[i][n-1] = dungeon[i][n-1] < life[i+1][n-1] ? life[i+1][n-1] - dungeon[i][n-1] : 1;
    }
    for (int j = n-2; j >= 0; j--) {
        life[m-1][j] = dungeon[m-1][j] < life[m-1][j+1] ? life[m-1][j+1] - dungeon[m-1][j] : 1;
    }

    for (int i = m-2; i >= 0; i--) {
        for (int j = n-2; j >= 0; j--) {
            int next = Math.min(life[i+1][j], life[i][j+1]);
            life[i][j] = dungeon[i][j] < next ? next - dungeon[i][j] : 1;
        }
    }

    return life[0][0];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末途戒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子僵驰,更是在濱河造成了極大的恐慌喷斋,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒜茴,死亡現(xiàn)場離奇詭異星爪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粉私,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門顽腾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事抄肖【眯牛” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵漓摩,是天一觀的道長裙士。 經(jīng)常有香客問我,道長管毙,這世上最難降的妖魔是什么腿椎? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮夭咬,結(jié)果婚禮上酥诽,老公的妹妹穿的比我還像新娘。我一直安慰自己皱埠,他們只是感情好肮帐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著边器,像睡著了一般训枢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忘巧,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天恒界,我揣著相機(jī)與錄音,去河邊找鬼砚嘴。 笑死十酣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的际长。 我是一名探鬼主播耸采,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼工育!你這毒婦竟也來了虾宇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤如绸,失蹤者是張志新(化名)和其女友劉穎嘱朽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怔接,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搪泳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扼脐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岸军。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凛膏,到底是詐尸還是另有隱情杨名,我是刑警寧澤脏榆,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布猖毫,位于F島的核電站,受9級特大地震影響须喂,放射性物質(zhì)發(fā)生泄漏吁断。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一坞生、第九天 我趴在偏房一處隱蔽的房頂上張望仔役。 院中可真熱鬧,春花似錦是己、人聲如沸又兵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沛厨。三九已至,卻和暖如春摔认,著一層夾襖步出監(jiān)牢的瞬間逆皮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工参袱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留电谣,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓抹蚀,卻偏偏與公主長得像剿牺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子环壤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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