From 736a31af0eff7276023d679d45c7278a0e4f0f73 Mon Sep 17 00:00:00 2001 From: shrut_512 <84448891+Shrut012@users.noreply.github.com> Date: Mon, 31 Oct 2022 22:55:32 +0530 Subject: [PATCH] Create DungeonGame.cpp Use hp[i][j] to store the min hp needed at position (i, j), then do the calculation from right-bottom to left-up. Note: adding dummy row and column would make the code cleaner. --- DungeonGame.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 DungeonGame.cpp diff --git a/DungeonGame.cpp b/DungeonGame.cpp new file mode 100644 index 0000000..e8f6d6b --- /dev/null +++ b/DungeonGame.cpp @@ -0,0 +1,29 @@ +/* +The demons had captured the princess and imprisoned her in the bottom-right corner of a dungeon. The dungeon consists of m x n rooms laid out in a 2D grid. +Our valiant knight was initially positioned in the top-left room and must fight his way through dungeon to rescue the princess. The knight has an initial health +point represented by a positive integer. If at any point his health point drops to 0 or below, he dies immediately. Some of the rooms are guarded by demons +(represented by negative integers), so the knight loses health upon entering these rooms; other rooms are either empty (represented as 0) or contain magic orbs +that increase the knight's health (represented by positive integers). To reach the princess as quickly as possible, the knight decides to move only rightward or +downward in each step.Return the knight's minimum initial health so that he can rescue the princess. Note that any room can contain threats or power-ups, even the +first room the knight enters and the bottom-right room where the princess is imprisoned. +*/ + +class Solution { +public: + int calculateMinimumHP(vector > &dungeon) { + int M = dungeon.size(); + int N = dungeon[0].size(); + // hp[i][j] represents the min hp needed at position (i, j) + // Add dummy row and column at bottom and right side + vector > hp(M + 1, vector(N + 1, INT_MAX)); + hp[M][N - 1] = 1; + hp[M - 1][N] = 1; + for (int i = M - 1; i >= 0; i--) { + for (int j = N - 1; j >= 0; j--) { + int need = min(hp[i + 1][j], hp[i][j + 1]) - dungeon[i][j]; + hp[i][j] = need <= 0 ? 1 : need; + } + } + return hp[0][0]; + } +};