一些惡魔抓住了公主(p)並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士(k)最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。
騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。
有些房間由惡魔守衛,因此騎士在進入這些房間時會失去健康點數(若房間裡的值為負整數,則表示騎士將損失健康點數);其他房間要麼是空的(房間裡的值為 0),要麼包含增加騎士健康點數的魔法球(若房間裡的值為正整數,則表示騎士將增加健康點數)。
為了盡快到達公主,騎士決定每次只向右或向下移動一步。
編寫乙個函式來計算確保騎士能夠拯救到公主所需的最低初始健康點數。
例如,考慮到如下布局的地下城,如果騎士遵循最佳路徑 右 -> 右 -> 下 -> 下,則騎士的初始健康點數至少為 7。
-2 (k)-33
-5-10110
30-5 (p)
說明:
【思路】
這道題和一般dp題目不一樣的地方就是選項中有正數也有負數,而不僅選最大路徑值或者最小路徑值。
在騎士行走的過程中,所需健康點數=後續過程所需要的健康點數+當前房間所需要的健康點數(也可能不需要,或許還能獲得健康點數)。如果能想到上面這點,其實狀態方程已經很好判斷了。其中要注意的是健康點數一直都是正整數,所以最小值為1.
我們只需要記錄走到每個房間時所需要的健康點數即可。並且如果發現當前房間的數值要比後續需要的健康點數還要大,那麼當前健康點數補償為1(最小值)。
int min(int a,int b)
}for(j=*dungeoncolsize-2;j>=0;j--)
}for(i=dungeonsize-2;i>=0;i--)}}
return max[0][0];
}
簡化為一維陣列形式:可自己畫圖模擬賦值過程,依次從後往前按照列進行賦值時,只需要記錄後一列資料即可。
int min(int a,int b)
for(j=*dungeoncolsize-2;j>=0;j--)
}return max[0];
}
LeetCode 174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...
LeetCode174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...
Leetcode 174 地下城遊戲
一些惡魔抓住了公主 p 並將她關在了地下城的右下角。地下城是由 m x n 個房間組成的二維網格。我們英勇的騎士 k 最初被安置在左上角的房間裡,他必須穿過地下城並通過對抗惡魔來拯救公主。騎士的初始健康點數為乙個正整數。如果他的健康點數在某一時刻降至 0 或以下,他會立即死亡。有些房間由惡魔守衛,因...