思路:dp
难点:环怎么破?
偷第一间,则不能偷最后一间,也就是 [0,n-2]中打家劫舍的模板
不偷第一间,则可以偷最后一间,也就是 [1,n-1]中打家劫舍的模板
class Solution {
public:
int f(const vector<int>& v) {
int n = v.size();
if (n == 1) return v[0];
if (n == 2) return max(v[0], v[1]);
int a = v[0], b = max(v[0], v[1]);
for (int i = 2; i < n; ++i) {
int c = max(a + v[i], b);
a = b;
b = c;
}
return b;
}
int rob(vector<int>& v) {
int n = v.size();
if (n == 1) return v[0];
if (n == 2) return max(v[0], v[1]);
return max(f(vector<int>(v.begin(), v.begin() + n - 1)),
f(vector<int>(v.begin() + 1, v.begin() + n)));
}
};