【LeetCode 213】House Robber II

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(简单dp)的拓展版本,将之前一条笔直的街道改为了一条首位相连的环状街道。这就增加了一种情况:若强盗决定洗劫第一间房子,那么他就不能洗劫最后一间房子了(环嘛,首位相连的),若他不洗劫第一间房子,那么后面的房子就可以随意洗劫了。

 

class Solution {

public:



    int houseNum;//房子总数



    int smartRob(vector<int>& houses, const int start, const int stop)

    {

        //初始化dp数组及前2个房子的信息

        vector<int> dp(houseNum, 0);

        dp[0] = houses[0];

        dp[1] = houses[1];

        

        //两种情况,视start和stop的值确定,返回结果为当前洗劫模式下最大获利

        //若start == 1,则洗劫[0, houseNum-1]范围内的房间

        //若start == 2,则洗劫[1,  houseNum]范围内的房间

        for(int i = start; i < stop; i++)

            dp[i] = (i == start) ? max(dp[i-1], houses[i]):max(dp[i-1], dp[i-2] + houses[i]);

        

        return max(dp[houseNum - 2], dp[houseNum - 1]);

    }

    

    int rob(vector<int>& nums) {

    

        houseNum = nums.size();



        //两种特殊的情况,没有房子和只有一间房子

        if(houseNum == 0)

            return 0;

        if(houseNum == 1)

            return nums[0];

        

        //返回两种可能的洗劫方式中值最大的一个就是所求结果

        return max(smartRob(nums, 1, houseNum - 1), smartRob(nums, 2, houseNum));

    }

};        

 

你可能感兴趣的:(LeetCode)