LeetCode 174. Dungeon Game
只能向右或者向下,典型的DP问题。本题问的是能到达右下角的最小初始生命值。
dp[i][j] 表示从 dungeon[i][j] 位置到右下角的最小初始生命值。
dp[i][j] = min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j],同时要保证dp[i][j]始终>0。
为了整合边界条件,dp数组多了一行一列。
本题的关键是和以往的题目不同,子问题是由 i,j 到右下角,而不是传统的 左上角到 i,j,这和本题所求有关。
class Solution { public: int calculateMinimumHP(vector<vector<int>>& dungeon) { int m=dungeon.size(), n=dungeon[0].size(); vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX)); dp[m-1][n] = dp[m][n-1] = 1; // at least 1 hp for (int i=m-1;i>=0;--i){ for (int j=n-1;j>=0;--j){ dp[i][j] = min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j]; if (dp[i][j]<=0) dp[i][j]=1; } } return dp[0][0]; } };
时间复杂度 O(mn)

浙公网安备 33010602011771号