解题思路
这道题的意思是,有一圈房子,我们要去偷钱,但是不能偷相邻房子的钱,问最大可以投多少钱。比如有4个房子,这些房子里面的钱分别为[1,2,3,1],第一个1和最后一个1的房子是相邻的,不能同时偷这两个房子里面的钱。
和一般动态规划问题不一样的地方在于,这里的房子是连续的,就是第一栋房子和最后一栋房子是连在一起的。
做法是,假设我们有5个房a、b、c、d、e,使用动态规划分别求偷a,b,c,d能得到的最大的钱数,以及偷b,c,d,e能得到的最大钱数,从这两个钱数里面取较大者,就是我们能从a,b,c,d,e里面可以偷到的最大钱数。
提交代码
class Solution {
public int rob(int[] nums) {
if(nums.length==0) return 0;
if(nums.length==1) return nums[0];
if(nums.length==2) return Math.max(nums[0], nums[1]);
int[] dp1=new int[nums.length-1];
int[] dp2=new int[nums.length-1];
dp1[0]=nums[0];dp1[1]=Math.max(nums[0], nums[1]);
dp2[0]=nums[1];dp2[1]=Math.max(nums[1], nums[2]);
for(int i=2;i<nums.length-1;i++)
dp1[i]=Math.max(dp1[i-1], dp1[i-2]+nums[i]);
for(int i=3;i<nums.length;i++)
dp2[i-1]=Math.max(dp2[i-2], dp2[i-3]+nums[i]);
return Math.max(dp1[nums.length-2],dp2[nums.length-2]);
}
}