因为为环形,所以动态规划状态定义时,要区分首尾状态: 1.头选尾不选
2.尾选头不选
具体看题解中的大佬分析就行了
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 0) return 0;
if(n == 1) return nums[0];
if(n == 2) return max(nums[0], nums[1]);
vector<int> f(n, 0), dp(n, 0);
f[0] = nums[0], f[1] = max(nums[0], nums[1]);
int t = nums[n - 1];
nums[n - 1] = 0;
for(int i = 2; i < n; i++){
f[i] = max(f[i - 1], f[i - 2] + nums[i]);
}
dp[0] = 0, dp[1] = nums[1], nums[n - 1] = t;
for(int i = 2; i < n; i++){
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
}
return max(f[n - 1], dp[n - 1]);
}
};