标签:c++ leetcode 213 house robber ii
Note: This is an extension of House Robber.
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.
所有邻居围城一个圈,作为小偷的你要尽可能偷最多的钱,而不被警察发现,如果偷相邻的邻家,就会报警
有N个邻居,因为围成一个圈,所以第一户和最后一户相邻,只要求得1~N和2~N-1住户偷得钱的最大值就好
使用一个类标记到第i个住户时的最大值,并表明要不要偷这一户人家
AC代码:
class Temp{ public : int value; int number; }; class Solution { public: int cal(vector<int> &nums,int start,int stop) { Temp count[stop-start+1]; count[0].value=nums[start]; count[0].number=start; if(nums[start+1]>nums[start]) { count[1].value=nums[start+1]; count[1].number=start+1; } else { count[1].value=nums[start]; count[1].number=start; } for(int i=start+2;i<=stop;++i) { if(count[i-start-1].number!=i-1) { count[i-start].value=count[i-start-1].value+nums[i]; count[i-start].number=i; } else { if(nums[i]+count[i-start-2].value>count[i-start-1].value) { count[i-start].value=nums[i]+count[i-start-2].value; count[i-start].number=i; } else { count[i-start].value=count[i-start-1].value; count[i-start].number=i-start-1; } } } return count[stop-start].value; } int rob(vector<int>& nums) { int sum=nums.size(); if(sum==0) return 0; if(sum==1) return nums[0]; if(sum==2) return nums[0]>nums[1]?nums[0]:nums[1]; int x=cal(nums,0,sum-2); int y=cal(nums,1,sum-1); return x>y?x:y; } };
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:c++ leetcode 213 house robber ii
原文地址:http://blog.csdn.net/er_plough/article/details/47298021