Título: https://leetcode-cn.com/problems/dungeon-game/
Título: Dada una matriz, vaya de (0, 0) a (n-1, m-1), cada vez que solo puede bajar Ir a la derecha requiere que el volumen de sangre permanezca positivo durante el proceso. Encuentre el volumen sanguíneo inicial mínimo.
Solución del problema: este es el problema de maximización del valor mínimo. El reverso no es bueno, considere el reverso. Hacer
representa el volumen sanguíneo mínimo requerido para alcanzar este punto. Si los puntos vecinos son negativos, significa que ir hacia atrás necesita un consumo adicional, tomar el consumo mínimo y agregar su propio valor de puntos; si hay un valor positivo en los puntos vecinos, significa que no hay consumo adicional yendo hacia atrás, solo considere su propio El valor del punto es suficiente.
class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& dungeon) {
int n = dungeon.size();
if(!n) return 0;
int m = dungeon[0].size();
if(!m) return 0;
vector<vector<int> >dp = vector<vector<int> >(n+1,vector<int>(m+1));
for(int i = n-1;i >= 0;i--) {
for(int j = m-1;j >= 0;j--) {
if(i == n-1 && j == m-1) {
dp[i][j] = dungeon[i][j];
continue;
}
dp[i][j] = INT_MIN;
if(i < n-1) dp[i][j] = max(dp[i][j],dp[i+1][j]);
if(j < m-1) dp[i][j] = max(dp[i][j],dp[i][j+1]);
if(dp[i][j] > 0) dp[i][j] = dungeon[i][j];
else dp[i][j] += dungeon[i][j];
}
}
// for(int i = 0 ;i < n;i++) {
// for(int j = 0;j < m;j++) {
// printf("%d ",dp[i][j]);
// }
// printf("\n");
// }
if(dp[0][0] > 0) return 1;
return -dp[0][0]+1;
}
};