BM79 打家劫舍(二)

描述

你是一个经验丰富的小偷,准备偷沿湖的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家,就不能再偷第二家,如果偷了第二家,那么就不能偷第一家和第三家。沿湖的房间组成一个闭合的圆形,即第一个房间和最后一个房间视为相邻。

给定一个长度为n的整数数组nums,数组中的元素表示每个房间存有的现金数额,请你计算在不被发现的前提下最多的偷窃金额。


数据范围:数组长度满足 Java练习题—动态规划(十五)_Math,数组中每个值满足 Java练习题—动态规划(十五)_Math_02

示例1

输入:

[1,2,3,4]
  • 1.

返回值:

6
  • 1.

说明:

最优方案是偷第 2 4 个房间
  • 1.


Java代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public int rob (int[] nums) {
        int ans1 = build(nums, 0, nums.length - 1); //实际能取到的
        int ans2 = build(nums, 1, nums.length);
        return Math.max(ans1, ans2);
    }
    public int build(int[] nums, int begin, int end) {
        if (nums.length == 0) return 0;
        if (nums.length == 1) return nums[begin];
        if (nums.length == 2) return Math.max(nums[begin], nums[begin + 1]);
        int[] dp = new int[end];
        dp[begin] = nums[begin]; //这里不要用0、1,这里用begin、end
        dp[begin + 1] = Math.max(nums[begin], nums[begin + 1]);
        for (int i = 2; i < end; i++) {
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[end - 1];
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.