题目描述
思路分析
数字三角形模型Dp
f
[
i
]
[
j
]
:
(
i
,
j
)
−
>
右
下
角
,
i
,
j
所
需
要
的
最
小
初
始
值
。
f[i][j]:(i,j)->右下角,i,j所需要的最小初始值。
f[i][j]:(i,j)−>右下角,i,j所需要的最小初始值。
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
+
1
]
[
j
]
,
f
[
i
]
[
j
+
1
]
)
;
f[i][j]=min(f[i+1][j],f[i][j+1]);
f[i][j]=min(f[i+1][j],f[i][j+1]);
f
[
i
]
[
j
]
=
m
a
x
(
1
,
f
[
i
]
[
j
]
)
f[i][j]=max(1,f[i][j])
f[i][j]=max(1,f[i][j])
注意边界
代码实现
class Solution {
public:
int calculateMinimumHP(vector<vector<int>>& dungeon) {
int n=dungeon.size(),m=dungeon[0].size();
vector<vector<int>> f(n,vector<int>(m,1e8));
for(int i=n-1;i>=0;i--){
for(int j=m-1;j>=0;j--){
if(i==n-1&&j==m-1) f[i][j]=max(1,1-dungeon[i][j]);
else{
if(i+1<n) f[i][j]=f[i+1][j]-dungeon[i][j];
if(j+1<m) f[i][j]=min(f[i][j],f[i][j+1]-dungeon[i][j]);
f[i][j]=max(1,f[i][j]);
}
}
}
return f[0][0];
}
};