题面
题解(状态机模型)
对于线性 f[i][0] = max(f[i-1][0],f[i-1][1]) ; f[i][1]=f[i-1][0]+w[i] ,对于环形,我们可以用枚举的方法,我们假设第一个点不选,那么f[0][0] = 0,f[0][1]=-INF(不合法) ,最后的最大值就是max(f[n-1][0],f[n-1][1]) ;假设第一个点选,那么f[0][0]=-INF,f[0][1]=w[0],最后一个点就不能选,最大值只能是f[n-1][0],最后的答案在两者中取最大即可
代码
class Solution {
public:
int rob(vector<int> &nums) {
int n = nums.size();
if (n == 1) return nums[0];
int INF = 1e9;
int f[n][2];
//选开始
f[0][1] = nums[0], f[0][0] = -INF;
for (int i = 1; i < n; i++) {
f[i][0] = max(f[i - 1][1], f[i - 1][0]);
f[i][1] = f[i - 1][0] + nums[i];
}
int res = f[n - 1][0];
//不选开始
f[0][0] = 0, f[0][1] = -INF;
for (int i = 1; i < n; i++) {
f[i][0] = max(f[i - 1][1], f[i - 1][0]);
f[i][1] = f[i - 1][0] + nums[i];
}
return max(res, max(f[n - 1][0], f[n - 1][1]));
}
};