class Solution {
public int rob(int[] nums) {
int[] dp = new int[nums.length+1];
dp[0] = 0;
dp[1] = nums[0];
for(int i = 2;i<=nums.length;i++){
dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i-1]);
}
return dp[nums.length];
}
}
思路:当房屋是一个环行的时候,可以分情况考虑,第一种情况,第一间房间不偷窃,可以偷窃最后一个房间;第二种情况,偷窃第一个房间,不可以偷窃最后一个房间。
class Solution {
public int rob(int[] nums) {
if(nums.length == 1)
return nums[0];
int[] dp1 = new int[nums.length+1];//第一个不取
int[] dp2 = new int[nums.length+1];//第一个取
dp1[0] = 0;
dp1[1] = 0;
for(int i = 2;i<=nums.length;i++){
dp1[i] = Math.max(dp1[i-1],dp1[i-2]+nums[i-1]);
}
dp2[0] = 0;
dp2[1] = nums[0];
for(int i = 2;i<nums.length;i++){
dp2[i] = Math.max(dp2[i-1],dp2[i-2]+nums[i-1]);
}
return Math.max(dp1[nums.length],dp2[nums.length-1]);
}
}