码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 174. Dungeon Game(DP)

时间:2020-01-27 17:32:36      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:problem   public   game   题解   不能   ==   动态   需要   题目   

题目

题意:每个格子里都有数字,负数代表你会少血,正数代表你会加血,当你的血量为0的时候就死了,从左上角出发,到右下角,问你一开始最少的血量是多少。整个过程中不能有血量为0的情况。

题解:只能走下或者走右。这种有向无环图,八成都是动态规划。但是如果从左上角开始规划,有很多情况要考虑。从右下角开始规划,才可以。

dp[i][j]代表从i,j到右下角,最低需要多少血量。

class Solution {
public:
    int dp[1005][1005];
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
       
        
       for(int i=0;i<dungeon.size();i++)
       {
           for(int j=0;j<dungeon[i].size();j++)
           {
               dp[i][j] = 99999999;
           }
       }
        
       for(int i=dungeon.size()-1;i>=0;i--)
       {
          for(int j=dungeon[i].size()-1;j>=0;j--)
          {
            
              if(i!=dungeon.size()-1)
              {
                  if(dungeon[i][j]<0)
                  {
                      int x = dp[i+1][j] + dungeon[i][j]*-1;
                      if(dp[i+1][j]==0)
                          x ++;
                      dp[i][j] = min(dp[i][j],x);
                      
                  }
                  else
                  {
                      int x = (dp[i+1][j] - dungeon[i][j])<0?0:(dp[i+1][j] - dungeon[i][j]);
                      dp[i][j] = min(dp[i][j],x);
                  }
              }
               
              if(j!=dungeon[i].size()-1)
              {
                  if(dungeon[i][j]<0)
                  {
                      int x = dp[i][j+1] + dungeon[i][j]*-1;
                      if(dp[i][j+1]==0)
                          x++;
                      dp[i][j] = min(dp[i][j],x);
                  
                  }
                  else
                  {
                      int x= (dp[i][j+1] - dungeon[i][j])<0?0:(dp[i][j+1] - dungeon[i][j]);
                      dp[i][j]=min(dp[i][j],x);
                  }
              }
              
              if(j==dungeon[i].size()-1&&i==dungeon.size()-1)
              {
                  if(dungeon[i][j]<0)
                  {
                      dp[i][j]=dungeon[i][j]*-1 +1;
                  }
                  else if(dungeon[i][j]==0)
                  {
                      dp[i][j]=1;
                  }
                  else
                      dp[i][j]=0;
              }
          }
       }
        
          return max(dp[0][0],1);
        
    }
    
  
};

LeetCode 174. Dungeon Game(DP)

标签:problem   public   game   题解   不能   ==   动态   需要   题目   

原文地址:https://www.cnblogs.com/dacc123/p/12236149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!