题目链接:https://leetcode.cn/problems/house-robber-ii/description/

cpp
class Solution {
public:
int rob(vector<int>& nums)
{
int n = nums.size();
// 两种情况下的最大值
return max(nums[0] + rob1(nums, 2, n - 2), rob1(nums, 1, n - 1));
}
int rob1(vector<int>& nums, int left, int right)
{
/*打家劫舍Ⅰ里的逻辑*/
if (left > right) return 0;
// 1. 创建dp表
int n = nums.size();
vector<int> f(n);
auto g = f;
// 2. 初始化
f[left] = nums[left];
// 3. 填表
for (int i = left + 1; i <= right; ++i)
{
f[i] = nums[i] + g[i - 1];
g[i] = max(f[i - 1], g[i - 1]);
}
// 4. 返回值
return max(f[right], g[right]);
}
};