blog

動的計画法における「事後性なし」を理解する

トピック174:ダンジョンゲーム公式ソリューション\nJavaコード\nインポート ;)\npublic class ソリューション {\n public class Solution { publi...

May 12, 2020 · 2 min. read
シェア

第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];
 }
};
Read next

巧みに2つのspan要素の間のスペースに隙間がなくなるようにした!

html、cssの初心者の学生は、このような問題が発生しませんか?仲の良い友人のペアの間にギャップが常にあります。ちょうど次の画像のように:実際には、スペースです。 そして、それは2つのスパンの差動ギャップがあるように、この問題のない行送りです。 しかし、この方法には問題があり、まず、フォントサイズが一度書き換えられ、その後...

May 12, 2020 · 2 min read