1. 程式人生 > 其它 >Leetcode 174. 地下城遊戲(困難) 動態規劃

Leetcode 174. 地下城遊戲(困難) 動態規劃

174. 地下城遊戲(困難)

題目:

輸入一個儲存著整數的二維陣列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();
        
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; } };
聯絡方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=