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.
Credits:
Special thanks to @Freezen for adding this problem and creating all test cases.
题意:
环形数组,求不相邻的子数组最大和。
思路:
对于任意一个数,只能有两种情况,在和不在。如果在的话,它相邻的数肯定不在,假设左边的不在,那么剩余的就可以看做一个直线型的数组;如果这个数不在,那么它左边的数和它右边的数也可以构成一个直线型数组。再按照之前那个做法做就行了。
代码:
class Solution {
public int rob(int[] nums) {
int t=nums.length;
int max1=0,max2=0;
int []dp=new int[t];
if(t==0)
return 0;
if(t==1)
return nums[0];
if(t==2)
return Math.max(nums[0],nums[1]);
if(t==3)
return Math.max(Math.max(nums[0],nums[1]),nums[2]);
dp[0]=nums[0];
dp[1]=Math.max(nums[0],nums[1]);
for(int i=2;i<t-1;i++)
{
dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);
max1=Math.max(max1,dp[i]);
}
for(int i=0;i<t;i++)
{
dp[i]=0;
}
dp[1]=nums[1];
dp[2]=Math.max(nums[1],nums[2]);
for(int i=3;i<t;i++)
{
dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);
max2=Math.max(max2,dp[i]);
}
return Math.max(max2,max1);
}
}