题目链接:
状态划分:考虑是否偷 \(\rm nums[0]\)
-
若偷 \(\rm nums[0]\),则 \(\rm nums[1]\) 和 \(\rm nums[n-1]\) 不能偷,问题变为从 \(\rm nums[2]\) 到 \(\rm nums[n-2]\) 的非环形版本,可直接调用 198 题的代码
-
若不偷 \(\rm nums[0]\),问题变为从 \(\rm nums[1]\) 到 \(\rm nums[n-1]\) 的非环形版本,同样调用198 题的代码解决
注:这种截出一段的非环形版本,用空间优化后的代码版本更为简洁。
class Solution {
public:
int rob1(vector<int> &nums, int start, int end) {//[start,end)左闭右开
int f0 = 0, f1 = 0;//f0表示上上次的结果, f1表示上次的结果
for (int i = start; i < end; i++) {
int new_f = max(f1, f0 + nums[i]);
f0 = f1;
f1 = new_f;
}
return f1;//f1是最后一次算出来的new_f
}
int rob(vector<int>& nums) {
int n = nums.size();
return max(nums[0] + rob1(nums, 2, n - 1), rob1(nums, 1, n));
}
};
标签:f0,f1,213,nums,int,ll,start,rm,打家劫舍
From: https://www.cnblogs.com/pangyou3s/p/18137499