leetcode 213. House Robber II

解决一个贼如何在环形排列的房屋中最大化抢劫金额的问题,同时避免触发警报。采用动态规划算法,确保相邻房屋不会被同时抢劫。

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;
	}
};

accepted
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值