先说思路,既然首尾不能同时用,就把收尾分开,一个数组有头一个数组有尾,然后就是普通的打家劫舍进行两次,再比较这两个的大小。至于动态规划,就是比较两端和中间数的大小,将大的问题分解成小的问题。https://blog.csdn.net/weixin_48680010/article/details/116585115?spm=1001.2014.3001.5502 可以看下这个
class Solution {
public int rob(int[] nums) {
//边界情况
if(nums.length==0 || nums==null){
return 0;
}
if(nums.length==1){
return nums[0];
}
if(nums.length<=2){
return Math.max(nums[0],nums[1]) ;
}
//创建数组
int [] dp=new int [nums.length];
int [] dp2=new int [nums.length];
//去头去尾,留两个数组
//去尾
int[]nums1=new int [nums.length-1];
for(int i=0;i<nums1.length;i++) {
nums1[i]=nums[i];}
dp[0]=nums1[0];
dp[1]=Math.max(nums1[0],nums1[1]);
//去头
int[]nums2=new int [nums.length-1];
for(int ji=1;ji<=nums2.length;ji++) {
nums2[ji-1]=nums[ji];
}
dp2[0]=nums2[0];
dp2[1]=Math.max(nums2[0],nums2[1]);
for(int ki=2;ki<nums1.length;ki++){
dp[ki]=Math.max(dp[ki-2]+nums1[ki],dp[ki-1]);
}
for(int li=2;li<nums2.length;li++){
dp2[li]=Math.max(dp2[li-2]+nums2[li],dp2[li-1]);
}
int max=Math.max(dp[nums1.length-1],dp2[nums2.length-1]);
return max ;
}}