Leetcode 174. 地下城遊戲(困難) 動態規劃
阿新 • • 發佈:2022-03-01
題目:
輸入一個儲存著整數的二維陣列grid
,如果grid[i][j] > 0
,說明這個格子裝著血瓶,經過它可以增加對應的生命值;如果grid[i][j] == 0
,則這是一個空格子,經過它不會發生任何事情;如果grid[i][j] < 0
,說明這個格子有怪物,經過它會損失對應的生命值。
現在你是一名騎士,將會出現在最上角,公主被困在最右下角,你只能向右和向下移動,請問你初始至少需要多少生命值才能成功救出公主?
換句話說,就是問你至少需要多少初始生命值,能夠讓騎士從最左上角移動到最右下角,且任何時候生命值都要大於 0。
思路:
從右下角往原點回走。記錄每個點的血量最小值
base case是dp[m-1][n-1]=max(0,-grid[m-1][n-1]),
在遍歷過程中,因為只能往右和往下走,所以要判斷dp[i+1][j] 和dp[i][j+1]的大小,同時要記得過程中保持血量>0
對於I==m-1和j==n-1的邊上,則只能取右邊和下邊的值
在最後的時候返回dp[0][0]+1。這樣就是保持血量最低都為1.
class Solution { public: int calculateMinimumHP(vector<vector<int>>& dungeon) { int m=dungeon.size();聯絡方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=int n=dungeon[0].size(); vector<vector<int>> dp(m,vector<int>(n)); for(int i=m-1;i>=0;--i){ for(int j=n-1;j>=0;--j){ //base case。到終點時只有1滴血。因為1在最後加,所以過程中保持dp>=0 if(i==m-1&&j==n-1){ dp[i][j]=max(0,-dungeon[i][j]); }else if(i==m-1){ //對於底邊,只能往右走 dp[i][j]=max(0,dp[i][j+1]-dungeon[i][j]); }else if(j==n-1){ //對於右邊界,只能往下走 dp[i][j]=max(0,dp[i+1][j]-dungeon[i][j]); }else{ dp[i][j]=max(0,min(dp[i+1][j],dp[i][j+1])-dungeon[i][j]); } } } //全程保持血量>=1 return dp[0][0]+1; } };