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.

分析

这道题其实也不难,与 House Robber I相比只要分两种情况就可以了,第一种情况是rob first house,则第二个house和最后一个house肯定不能rob了。第二种情况是not to rob first house,则第二个house和最后一个house可以rob。用动态规划,rob,和notrob分别表示抢劫和不抢劫某个house对应的最大值,动态转移方程是rob=notrob(上一个house)+nums[i], notrob=max ( rob(上一个house) , notrob(上一个house) )。

粗鲁的分类写法

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.size()==0) return 0;
        //situation 1 rob first house
        int rob,notrob;
        rob=notrob=nums[0];
        int temp=nums[0];
        for(int i=2;i<nums.size()-1;i++){
            rob=notrob+nums[i];
            notrob=temp;
            temp=max(rob,notrob);
        }
        int max1=max(rob,notrob);
        //situation 2 not rob first house
        rob=notrob=temp=0;
        for(int i=1;i<nums.size();i++){
            rob=notrob+nums[i];
            notrob=temp;
            temp=max(rob,notrob);
        }
        int max2=max(rob,notrob);
        return max(max1,max2);
    }
};

知性的调用函数写法
···
class Solution {
public:
int help(vector& nums,int s,int e){
int rob=0,notrob=0,temp=0;
for(int i=s;i<e;i++){
rob=notrob+nums[i];
notrob=temp;
temp=max(rob,notrob);
}
return temp;
}
int rob(vector& nums) {
if(nums.size()==0) return 0;
return max(help(nums,2,nums.size()-1)+nums[0],help(nums,1,nums.size()));
}
};
···

posted @ 2018-12-03 15:06  A-Little-Nut  阅读(88)  评论(0编辑  收藏  举报