动态规划:假设抢到第i个房间了, money[i] = max(num[i] + money[i-2], money[i-1]); 因为是一个圈,要记录i是来自哪里,用于判断最后一个的最大值是否来自最开始的那个(ffuckk,不会描述)
vector<int> money;
vector<int> pre_index;//记录当前这个钱 是从哪个房间来的int lenght;
int findInitIndex(int index)
{
while(pre_index[index] != -1)
{
index = pre_index[index];
}
return index;
}
int rob(vector<int>& nums)
{
if(nums.empty())
return 0;
lenght = nums.size();
if(1 == lenght)
return nums[0];
if(2 == lenght)
return max(nums[0], nums[1]);
money.resize(lenght);
pre_index.resize(lenght);
int max_money = -1;
for(int begin = 0; begin < lenght; ++begin)
{
money.clear();
pre_index.clear();
money[begin] = nums[begin];
pre_index[begin] = -1;
int next = (begin + 1) % lenght;
if(nums[next] > money[begin]){
money[next] = nums[next];
pre_index[next] = -1;
}else{
money[next] = nums[begin];
pre_index[next] = begin;
}
int current_begin = begin;
int last_last, last, current;
/*对剩余的 k-2 进行遍历*/
for(int i = 0; i < lenght - 2; ++i)
{
last_last = current_begin % lenght;
last = (current_begin + 1) % lenght;
current = (current_begin + 2) % lenght;
if(nums[current] + money[last_last] > money[last]){
money[current] = nums[current] + money[last_last];
pre_index[current] = last_last;
}else{
money[current] = money[last];
pre_index[current] = last;
}
++current_begin;
}
/*
* 此时 current是 从begin开始遍历的最后一个。 他俩是相邻的,一个头 一个尾
* 如果 current的money值 是从 begin开始的,则应该取上一个作为最大值
**/
if(findInitIndex(current) == begin){
max_money = max(max_money, money[last]);
}else{
max_money = max(max_money, money[current]);
}
}
return max_money;
}