36 地下城遊戲

2021-09-28 18:08:49 字數 1356 閱讀 8393

題目描述:

一些惡魔抓住了公主(p)並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士(k)最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。

騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。

有些房間由惡魔守衛,因此騎士在進入這些房間時會失去健康點數(若房間裡的值為負整數,則表示騎士將損失健康點數);其他房間要麼是空的(房間裡的值為 0),要麼包含增加騎士健康點數的魔法球(若房間裡的值為正整數,則表示騎士將增加健康點數)。

為了盡快到達公主,騎士決定每次只向右或向下移動一步。

編寫乙個函式來計算確保騎士能夠拯救到公主所需的最低初始健康點數。

例如,考慮到如下布局的地下城,如果騎士遵循最佳路徑 右 -> 右 -> 下 -> 下,則騎士的初始健康點數至少為 7。

說明:騎士的健康點數沒有上限。

任何房間都可能對騎士的健康點數造成威脅,也可能增加騎士的健康點數,包括騎士進入的左上角房間以及公主被監禁的右下角房間。

我的dp[i][j][k] 想的複雜而且出錯了dp一生錯???

看看別人的dp把

class solution 

int row = dungeon.length;

int col = dungeon[0].length;

// dp[i][j],代表當前格仔走到右下角需要的最低血量,依賴後面的路徑,與前面的路徑無關

int dp = new int[row][col];

// 邊界條件,dungeon[row - 1][col - 1] > 0 說明本格不掉血,只需有最低的1滴血就可以

dp[row - 1][col - 1] = dungeon[row - 1][col - 1] > 0 ? 1 : -dungeon[row - 1][col - 1] + 1;

// 邊界條件,最下面的一行,dungeon[row - 1][i] >= dp[row - 1][i + 1] ,本格仔的數目大於等於下一步需要的血滴數,說明本格仔自身數目就可以補充後面路程的消耗,故也只

// 需要1滴血就可以,否則,就需要系統補血了,補血值等於後面路徑的消耗即加上當前格仔所需要補充的血量

for (int i = col - 2; i >= 0; i--)

for (int i = row - 2; i >= 0; i--)

for (int i = row - 2; i >= 0; i--)

}return dp[0][0];}}

174 地下城遊戲

一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...

174 地下城遊戲

174.地下城遊戲 一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有...

174 地下城遊戲

一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...