1.题目
2.算法
题目的意思是从左上角到右下角,用最少的数值,这道题用动态规划比较好做,我们从反面推,从右下角开始找用最少血的
最先初始化的是公主所在的房间的起始生命值,然后慢慢向第一个房间扩散,不断的得到各个位置的最优的起始生命值。递归方程为: 递归方程是dp[i][j] = max(1, min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j]).
public int calculateMinimumHP(int[][] dungeon)
{
int m = dungeon.length;
int n = dungeon[0].length;
int[][] dp = new int[m][n];
dp[m-1][n-1] = Math.max(1, 1 - dungeon[m - 1][n - 1]);
for (int i = m - 2; i >= 0; i--)
{
dp[i][n - 1] = Math.max(1, dp[i + 1][n - 1]) - dungeon[i][n - 1];
}
for (int i = n - 2; i >= 0; i--)
{
dp[m - 2][i] = Math.max(1, dp[m - 2][i + 1]) - dungeon[m - 2][i];
}
for (int i = m - 2; i >= 0; i--)
{
for (int j = n - 2; j >= 0; j--)
{
dp[i][j] = Math.max(1, Math.min(dp[i][j + 1], dp[i + 1][j])) - dungeon[i][j];
}
}
return dp[0][0];
}