【leetcode dp】Dungeon Game

https://leetcode.com/problems/dungeon-game/description/

【题意】

给定m*n的地牢,王子初始位置在左上角,公主在右下角不动,王子要去救公主,每步只能往右或往下走一格。每个格子是一个整数,负数代表生命值减掉相应分数,正数表示生命值增加相应分值,要保证王子在走的过程中不挂掉,即经过每个格子后的生命值大于等于1,问王子最初的生命值最少是多少。

【思路】

倒着推dp,计算(i,j)->(m,n)的可生存血量。

dp[i][j]=max(1,min(dp[i+1][j],dp[i][j+1])-a[i][j]]);

【AC】

 1 class Solution {
 2 public:
 3     int calculateMinimumHP(vector<vector<int>>& dungeon) {
 4         int m=dungeon.size();
 5         int n=dungeon[0].size();
 6         const int inf=0x3f3f3f3f;
 7         vector<vector<int> > dp(m+1,vector<int>(n+1));
 8         for(int i=0;i<=m;i++){
 9             for(int j=0;j<=n;j++){
10                 dp[i][j]=inf;
11             }
12         }
13         dp[m-1][n-1]=max(1,1-dungeon[m-1][n-1]);
14         for(int k=m+n-3;k>=0;k--){
15             for(int i=0;i<m;i++){
16                 int j=k-i;
17                 if(j<0||j>=n) continue;
18                 dp[i][j]=max(1,min(dp[i][j+1],dp[i+1][j])-dungeon[i][j]);
19             }
20         }
21         return dp[0][0];
22     }
23 };
View Code

 

posted @ 2018-05-05 15:25  shulin15  阅读(171)  评论(0编辑  收藏  举报