当前位置: 首页剑指offer刷题第六期问题详情 【动态规划专题】LeetCode 174. 地下城游戏 本问题对应课程链接:剑指offer刷题第六期 要求: 1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。 2、给出你代码所用的时间复杂度和空间复杂度
共以下 4 个回答
class Solution {
public int calculateMinimumHP(int[][] dungeon) {
int[][] dp = new int[dungeon.length][dungeon[0].length];
dp[dungeon.length-1][dungeon[0].length-1] = 1 + Math.max(0, – dungeon[dungeon.length-1][dungeon[0].length-1]);
for(int i = dungeon.length – 2; i >= 0; i–){
dp[i][dungeon[0].length – 1] = Math.max(1,dp[i + 1][dungeon[0].length – 1] – dungeon[i][dungeon[0].length – 1]);
}
for(int j = dungeon[0].length – 2; j >= 0; j–){
dp[dungeon.length – 1][j] = Math.max(1, dp[dungeon.length – 1][j + 1] – dungeon[dungeon.length – 1][j]);
}
}
//dp
//空间复杂度On2
//时间复杂度On2
找了一个能看懂的题解,用的是递归方法,通过memory数组减少重复计算
思路:使用动态规划的思想反向递推
“`c++>& dungeon) {> dp(m, vector (n, 0));
class Solution {
public:
int calculateMinimumHP(vector
int m = dungeon.size(), n = dungeon[0].size();
vector
dp[m-1][n-1] = dungeon[m-1][n-1];
// 设置最后一列 i
int i=m-2, j=n-1;
for (; i>=0; i–) {
if (dp[i+1][j] < 0) { dp[i][j] = dp[i+1][j] + dungeon[i][j]; } else { dp[i][j] = dungeon[i][j]; } } // 设置最后一行 j i=m-1, j=n-2; for (; j>=0; j–) {
if (dp[i][j+1] < 0) { dp[i][j] = dp[i][j+1] + dungeon[i][j]; } else { dp[i][j] = dungeon[i][j]; } } for (int i=m-2; i>=0; i–) {
for (int j=n-2; j>=0; j–) {
int maxi = max(dp[i+1][j], dp[i][j+1]);
if (maxi < 0) { dp[i][j] = maxi + dungeon[i][j]; } else { dp[i][j] = dungeon[i][j]; } } } if (dp[0][0] >= 0) return 1;
return 1 – dp[0][0];
}
};