第174問:ダンジョンゲーム公式解答
Javaコード:
import java.util.Arrays;
public class Solution {
public int calculateMinimumHP(int[][] dungeon) {
int rows = dungeon.length;
int cols = dungeon[0].length;
// 1ビットを追加する理由を理解する
int[][] dp = new int[rows + 1][cols + 1];
for (int i = 0; i <= rows; i++) {
Arrays.fill(dp[i], Integer.MAX_VALUE);
}
// dpを初期化する[rows - 1][cols - 1] = 1
dp[rows][cols - 1] = 1;
dp[rows - 1][cols] = 1;
for (int i = rows - 1; i >= 0; i--) {
for (int j = cols - 1; j >= 0; j--) {
int minVal = Math.min(dp[i + 1][j], dp[i][j + 1]);
dp[i][j] = Math.max(minVal - dungeon[i][j], 1);
}
}
return dp[0][0];
}
}
Pythonのコード:
from typing import List
class Solution:
def calculateMinimumHP(self, dungeon: List[List[int]]) -> int:
rows = len(dungeon)
cols = len(dungeon[0])
dp = [[9999 for _ in range(cols + 1)] for _ in range(rows + 1)]
dp[rows][cols - 1] = 1
dp[rows - 1][cols] = 1
for i in range(rows - 1, -1, -1):
for j in range(cols - 1, -1, -1):
min_val = min(dp[i + 1][j], dp[i][j + 1])
dp[i][j] = max(min_val - dungeon[i][j], 1)
return dp[0][0]
C++コード:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int calculateMinimumHP(vector<vector<int>> &dungeon) {
int rows = dungeon.size();
int cols = dungeon[0].size();
vector<vector<int>> dp(rows + 1, vector<int>(cols + 1, INT_MAX));
dp[rows][cols - 1] = 1;
dp[rows - 1][cols] = 1;
for (int i = rows - 1; i >= 0; i--) {
for (int j = cols - 1; j >= 0; j--) {
int minVal = min(dp[i + 1][j], dp[i][j + 1]);
dp[i][j] = max(minVal - dungeon[i][j], 1);
}
}
return dp[0][0];
}
};





