思路:
因为这里面不可能同时抢第一个房间和最后一个房间。所以,我们可以把问题拆成两个。回归到House Robber I
问题一 第一个到倒数第二个房间采用House Robber I算法
问题二 第二个到最后一个房间采用House Robber I算法
比较大小后返回。。
之所以能够分成这两个问题的原因是
第一个和最后一个房间可以分成如下四种情况
1第一个和这后一个都抢 这不符合题意。问题一,二都不可能得着最优解是同时抢第一个和最后一个的出来的。
2只抢第一个
如果抢第一个,那么一定不能抢最后一个。
在问题一中,如果真的抢第一个可以带来最优解那么问题一会找出来。
3只抢最后一个
如果抢最后一个,那么一定不会抢第一个。
在问题二中,如果真的抢最后一个可以带来最优解那么问题二会找出来。
4两个都不抢 包括在两个子问题中。因为这两个子问题的最优解都可能没抢第一个和最后一个
public class Solution {
public int rob(int[] nums) {
if(nums.length==0)
{
return 0;
}
if(nums.length==1)
{
return nums[0];
}
int resultA=robHelp(nums, 0, nums.length-2);
int resultB=robHelp(nums, 1, nums.length-1);
return Math.max(resultA, resultB);
}
public int robHelp(int[] nums,int start,int end)
{
int unRob=0;
int doRob=0;
for(int i=start;i<=end;i++)
{
int temp=unRob;
unRob=Math.max(temp,doRob);
doRob=temp+nums[i];
}
return Math.max(unRob, doRob);
}
}