Leetcode P174 Java使用动态规划去解决
ideas
其实就是反向DP就可以,先假设最初生命值为1,然后一直DP操作,最终的dp[0][0]就是我们的答案
首先获取数组的长度,和创建一个dp数组
int n = dungeon.length;
int m = dungeon[0].length;
int[][] dp = new int[n+1][m+1];
接下来设置下初始生命值
dp[n][m-1] = 1;
dp[n-1][m] = 1;
接下来我们倒序判断,获取**Math.min(dp[i][j+1],dp[i+1][j]) - dungeon[i][j];**的值,如果该值小于1,那么就证明不需要此次的加血则不需要去更新当前的初始化血量状态,否则当前dp就等于此值
for (int i = n-1; i >= 0 ; i--) {
for (int j = m-1; j >= 0 ; j--) {
int hp = Math.min(dp[i][j+1],dp[i+1][j]) - dungeon[i][j];
if (hp < 1){
dp[i][j] = 1;
}else{
dp[i][j] = hp;
}
}
}
code
class Solution {
public int calculateMinimumHP(int[][] dungeon) {
int n = dungeon.length;
int m = dungeon[0].length;
int[][] dp = new int[n+1][m+1];
for (int[] ints : dp) {
Arrays.fill(ints,Integer.MAX_VALUE);
}
dp[n][m-1] = 1;
dp[n-1][m] = 1;
for (int i = n-1; i >= 0 ; i--) {
for (int j = m-1; j >= 0 ; j--) {
int hp = Math.min(dp[i][j+1],dp[i+1][j]) - dungeon[i][j];
if (hp < 1){
dp[i][j] = 1;
}else{
dp[i][j] = hp;
}
}
}
return dp[0][0];
}
}