“`java
class Solution {
public int calculateMinimumHP(int[][] dungeon) {
//从右下角往左上角走,i,j位置需要的最小能量为dp[i][j],那么i-1,j位置需要的最小能量就是dp[i][j] – dungeon[i][j],并且因为骑士能量小于1就会死掉,所以dp[i][j]>=1
//公式为dp[i][j] = max(Math.min(dp[i+1][j],dp[i][j+1]) – dungeon[i][j],1),dp[0][0]即为所求
int m = dungeon.length;
int n = dungeon[0].length;
//因为i=m-1或j=n-1时,公式会出现数组越界,所以dp数组范围边界需要是m和n
int[][] dp = new int[m+1][n+1];
for (int i = 0; i <= m; i++) {
Arrays.fill(dp[i], Integer.MAX_VALUE);
}
//i=m-1,j=n-1时,最后剩余的能量大于等于1即可,所以公式后面的值赋值为1即可
dp[m-1][n] = 1;
dp[m][n-1] = 1;
for (int i = m - 1; i >= 0; i–) {
for (int j = n – 1; j >= 0; j–) {
dp[i][j] = Math.max(Math.min(dp[i+1][j],dp[i][j+1]) – dungeon[i][j], 1);
}
}
return dp[0][0];
}
}
共以下 8 个回答
“`java
class Solution {
public int calculateMinimumHP(int[][] dungeon) {
//从右下角往左上角走,i,j位置需要的最小能量为dp[i][j],那么i-1,j位置需要的最小能量就是dp[i][j] – dungeon[i][j],并且因为骑士能量小于1就会死掉,所以dp[i][j]>=1
//公式为dp[i][j] = max(Math.min(dp[i+1][j],dp[i][j+1]) – dungeon[i][j],1),dp[0][0]即为所求
int m = dungeon.length;
int n = dungeon[0].length;
//因为i=m-1或j=n-1时,公式会出现数组越界,所以dp数组范围边界需要是m和n
int[][] dp = new int[m+1][n+1];
for (int i = 0; i <= m; i++) { Arrays.fill(dp[i], Integer.MAX_VALUE); } //i=m-1,j=n-1时,最后剩余的能量大于等于1即可,所以公式后面的值赋值为1即可 dp[m-1][n] = 1; dp[m][n-1] = 1; for (int i = m - 1; i >= 0; i–) {
for (int j = n – 1; j >= 0; j–) {
dp[i][j] = Math.max(Math.min(dp[i+1][j],dp[i][j+1]) – dungeon[i][j], 1);
}
}
return dp[0][0];
}
}
时间复杂度:O(mn)
空间复杂度:O(mn)
MY动态规划,官解
时间:O(mn)
空间:O(mn)
C++实现
“`C++>& dungeon) {> dp(m+1, vector (n+1,INT_MAX));
class Solution {
public:
int calculateMinimumHP(vector
int m = dungeon.size(), n = dungeon[0].size();
vector
for(int i=m-1;i>=0;i–)
{
for(int j=n-1;j>=0;j–)
{
if(i==m-1&&j==n-1)
{
if(dungeon[i][j]<0)
dp[i][j]=-1*dungeon[i][j]+1;
else
dp[i][j]=1;
continue;
}
int minv = min(dp[i+1][j], dp[i][j+1]);
dp[i][j]=max(minv-dungeon[i][j], 1);
}
}
return dp[0][0];
}
};
```
真的难
时间复杂度O(mn)