您的位置:首页 > 其它

LeetCode Dungeon Game

2015-01-28 21:20 274 查看
起初我是这样定义dp的。dp[i][j]表示从(0,0)到(i,j)需要的最少血量,那么有,

dp[i][j]=min(dp[i-1][j],dp[i][j-1])-dungeon[i][j];

大家可以想想这个方程对吗?

给这么一组数据 -3,2

那么我走到-3需要hp=4,那么走到2需要hp反而变少了,变成了2?试问我用hp等于2出发,连-3都过不了!

所以这样的方程明显错误。

换一种想法,如果我定义dp[i][j]]为从i,j走到终点的最少血量,那么有

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

假如我知道dp[i+1][j]和dp[i][j+1],然后保证走完dp[i][j]后的hp值能走这个两个值的较小的那个,那么dp[i][j]就可以求出来了,不过需要注意一点的是,假如dp[i][j]<0,那么有dp[i][j]=0,因为hp不能取负值,最后结果是dp[0][0]+1。

代码如下:

int dp[1001][1001];
int min(int x,int y)
{
return x<y?x:y;
}
class Solution {
public:
int calculateMinimumHP(vector<vector<int> > &dungeon) {
int i,j;
int n=dungeon.size();
int m=dungeon[0].size();
if(dungeon[n-1][m-1]<0)
dp[n-1][m-1]=-dungeon[n-1][m-1];
else
dp[n-1][m-1]=0;

for(i=n-2;i>=0;i--)
{
dp[i][m-1]=dp[i+1][m-1]-dungeon[i][m-1];
if(dp[i][m-1]<0)
dp[i][m-1]=0;
}
for(j=m-2;j>=0;j--)
{
dp[n-1][j]=dp[n-1][j+1]-dungeon[n-1][j];
if(dp[n-1][j]<0)
dp[n-1][j]=0;
}
for(i=n-2;i>=0;i--)
for(j=m-2;j>=0;j--)
{
dp[i][j]=min(dp[i+1][j],dp[i][j+1])-dungeon[i][j];
if(dp[i][j]<0)
dp[i][j]=0;
}
return dp[0][0]+1;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: