After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.
Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.
class Solution { void do_once(map<int, int>&candi, int& max, vector<int>&nums, int end) { map<int, int>newcandi; for (map<int, int>::iterator it = candi.begin(); it != candi.end(); it++) { if (it->first == end) { if (it->second > max) max = it->second; continue; } if (it->first + 2 < end) { if (newcandi.find(it->first + 2) == newcandi.end()) newcandi[it->first + 2] = it->second + nums[it->first]; else { if (it->second + nums[it->first] > newcandi[it->first + 2]) newcandi[it->first + 2] = it->second + nums[it->first]; } } else { if (it->second + nums[it->first] > max) max = it->second + nums[it->first]; } if (it->first + 1 == end) { if (it->second + nums[it->first] > max) max = it->second + nums[it->first]; continue; } if (it->first + 3 < end) { if (newcandi.find(it->first + 3) == newcandi.end()) newcandi[it->first + 3] = it->second + nums[it->first + 1]; else { if (it->second + nums[it->first + 1] > newcandi[it->first + 3]) newcandi[it->first + 3] = it->second + nums[it->first + 1]; } } else { if (it->first + 1 < end && it->second + nums[it->first + 1] > max) max = it->second + nums[it->first + 1]; } } candi = newcandi; } public: int rob(vector<int>& nums) { if (nums.empty()) return 0; if (nums.size() == 1) return nums[0]; if (nums.size() == 2) return nums[0] > nums[1] ? nums[0] : nums[1]; map<int, int>candi;//<int,int>(index,sum) candi.insert(pair<int, int>(2, nums[0])); int max = 0; while (!candi.empty()) { do_once(candi, max, nums, nums.size() - 1); } candi.insert(pair<int, int>(3, nums[1])); while (!candi.empty()) { do_once(candi, max, nums, nums.size()); } if (nums.size() > 4) { candi.insert(pair<int, int>(4, nums[2])); while (!candi.empty()) { do_once(candi, max, nums, nums.size()); } } return max; } };