环形抢劫
思路:一个圆上有n座房子,其它条件都一样,只是第1座房子和第n座房子变成相邻的了,也就是说不能同时抢了,那么最优解就变成 第1座房子到第n-1座房子能抢的最多的钱 或者 第2座房子到第n座房子能抢的钱了。
#include <bits/stdc++.h>
using namespace std;
int robOriginal(vector<int>& nums,int start ,int end) {
int pre3 = 0, pre2 = 0, pre1 = 0;
for(int i = start;i<=end;i++)
{
int cur = max(pre2,pre3)+nums[i];
pre3 = pre2;
pre2 = pre1;
pre1 = cur;
}
return max(pre1,pre2);
}
int rob(vector<int>& nums) {
int n = nums.size();
if(n==0) return 0;
if(n==1) return nums[0];
return max(robOriginal(nums,0,n-2),robOriginal(nums,1,n-1));
}
// int robOriginal(vector<int>& nums) {
// int a = 0, b = 0, res = 0;
//
// for(int i = 0; i < nums.size(); ++i){
// res = max(b + nums[i], a);
// b = a;
// a = res;
// }
//
// return res;
// }
//
// int rob(vector<int>& nums) {
// if(nums.empty()) return 0;
// if(nums.size() == 1) return nums[0];
//
// vector<int> numsA(nums.begin() + 1, nums.end());
// vector<int> numsB(nums.begin(), nums.end()-1);
//
// return max(robOriginal(numsA), robOriginal(numsB));
// }
int main()
{
vector<int> a;
int i = 0;
do{
cin>>i;
a.push_back(i);
}while(getchar() != '\n');
int ans = rob(a);
cout<<ans<<endl;
}