/** * 求解 * @param nums * @param head * @param tail * @return */ public static int rob(int[] nums, int head, int tail){ //dp[i]: 前 i 间房间能偷窃的最大价值 int[] dp = new int[tail-head+1+1];
//前0间房间的最大偷窃价值是 0 dp[0] = 0;
//前1间房间的最大偷窃价值是 num[head] dp[1] = nums[head];
//遍历得出每一个位置的情况 最后一个位置的情况tail-head+1 //(如果是索引就是tail-head,序号就是tail-head+1) for (int i = 2; i <= tail-head+1; i++){ //注意这里的 i 是序号 //如果是索引,这里是num[i] //因为是序号,所以是num[i-1] //但是数组是以head为起始索引,所以i-1+head dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i-1+head]); //dp[i-1]:前i-1个位置能偷窃的最大价值 //dp[i-2]+num[i-1+head]:前i-2个位置能偷窃的最大价值+当前位置的价值 }
return dp[tail-head+1]; }
/** * 测试程序 * @param args */ public static void main(String[] args) { int[] nums1 = new int[]{2,3,2};