破环:
3种情况:
1、选头不选尾
2、选尾不选头
3、不选头和尾
题目变化成打家劫舍1版本了,设置两个dp,一个舍去头一个舍去尾,之后比较两者最大值即可。
class Solution {
public int rob(int[] nums) {
int n = nums.length;
if (n == 0) return 0;
if (n == 1) return nums[0];
if(nums.length == 2) return Math.max(nums[0],nums[1]);
int[] dp1 = new int[n];//截止到第i家打劫的最大钱数
int[] dp2 = new int[n];
dp1[0] = nums[0];
dp1[1] = Math.max(nums[0], nums[1]);
for (int i = 2; i < n-1; i++) {//去尾
dp1[i] = Math.max(dp1[i - 1], dp1[i - 2] + nums[i]);
}
dp2[1] = nums[1];
dp2[2] = Math.max(nums[1], nums[2]);
for (int i = 3; i < n; i++) {//去头
dp2[i] = Math.max(dp2[i - 1], dp2[i - 2] + nums[i]);
}
return Math.max(dp1[n-2],dp2[n-1]);
}
}