int calculateMinimumHP(vector<vector<int> > &dungeon) { int n = dungeon.size(); if(n==0) return 0; int m = dungeon[0].size(); if(m==0) return 0; vector<int> minHP(m); for(int i=m-1;i>=0;i--) { if(i==m-1) minHP[i] = dungeon[n-1][m-1]>=0 ? 1: - dungeon[n-1][m-1]+1; else { int needed = minHP[i+1] - dungeon[n-1][i]; minHP[i] = needed > 0 ? needed : 1; } } for(int i=n-2;i>=0;i--) { for(int j=m-1;j>=0;j--) { if(j==m-1) { int needed = minHP[m-1] - dungeon[i][j]; minHP[m-1] = needed > 0 ? needed : 1; } else { int right = minHP[j+1] - dungeon[i][j]; int bottom = minHP[j] - dungeon[i][j]; minHP[j] = max(min(right, bottom), 1); } } } return minHP[0]; }
int calculateMinimumHP(vector<vector<int> > &dungeon) { size_t m = dungeon.size(); size_t n = dungeon[0].size(); int d[m][n] = { 0 }; d[m - 1][n - 1] = minHP(1 - dungeon[m - 1][n - 1]); for (int i = m - 2; i >= 0; --i) { d[i][n - 1] = minHP(d[i + 1][n - 1] - dungeon[i][n - 1]); } for (int j = n - 2; j >= 0; --j) { d[m - 1][j] = minHP(d[m - 1][j + 1] - dungeon[m - 1][j]); } for (int i = m - 2; i >= 0; --i) { for (int j = n - 2; j >= 0; --j) { d[i][j] = minHP(min(d[i + 1][j], d[i][j + 1]) - dungeon[i][j]); } } return d[0][0]; }