LeetCode 213. 打家劫舍 II
原题链接
中等
作者:
ITNXD
,
2021-04-16 15:56:55
,
所有人可见
,
阅读 283
简单记录
参考代码:
class Solution {
public:
/*
状态表示:f[i][j]:前i个选,当前状态为j的集合的最大值
状态计算:考虑0号点选与不选做两次dp即可!选择两次最大值即可!
注意:元素个数为1的特判,个数为1的逻辑和后方逻辑矛盾!
-1:表示矛盾
*/
int rob(vector<int>& nums) {
int n = nums.size();
// 特判:只有一个元素,则该元素既作为起点又作为终点,与下方逻辑选与不选矛盾(只有一个只能都选或都不选)
if(n == 1) return nums[0];
vector<vector<int>> f(n, vector<int>(2));
// 情况一:选0号位置
f[0][0] = 0, f[0][1] = nums[0];
for(int i = 1; i < n; i ++){
f[i][0] = max(f[i - 1][0], f[i - 1][1]);
f[i][1] = f[i - 1][0] + nums[i];
}
int res = f[n - 1][0];
// 情况二:不选0号位置
f[0][0] = 0, f[0][1] = -1;
for(int i = 1; i < n; i ++){
f[i][0] = max(f[i - 1][0], f[i - 1][1]);
f[i][1] = f[i - 1][0] + nums[i];
}
// 结果情况一二的最大值即可!
return max(res, max(f[n - 1][0], f[n - 1][1]));
}
};