动态规划入门2-打家劫舍

    public int rob(int[] nums) {
        if (nums.length == 1) {
            return nums[0];
        }
        int[][] dp = new int[nums.length][2];
        dp[0][0] = 0;
        dp[0][1] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            // 每家只有偷或者不偷
            // 如果偷,则总和为上家必须是没偷的总值加当前
            dp[i][1] = dp[i - 1][0] + nums[i];
            // 如果不偷,则总和为上家是偷或不偷的最大值
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
        }
        return Math.max(dp[nums.length - 1][0], dp[nums.length - 1][1]);
    }

    public int robBest(int[] nums) {
        if (nums.length == 1) {
            return nums[0];
        }
        if (nums.length == 2) {
            return Math.max(nums[0], nums[1]);
        }
        // 定义一个一维数组,存储每家的偷和不偷情况下的最大值
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for (int i = 2; i < nums.length; i++) {
            // 当前家的值如果偷,则上家不能偷,取上上家的值加当前家则为最大。
            // 当前家的值如果不偷,则上家最大值则为最大
            // 最终dp[i] 取偷或不偷的最大值即为当前家的策略最大值
            dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[nums.length - 1];
    }

}

你可能感兴趣的:(算法入门,动态规划,算法,leetcode)