Leetcode__198_rob_强盗抢劫

题目描述:

抢劫一排住户,但是不能抢邻近的住户,求最大抢劫量。

解决思路和代码:

package DP;

import java.util.Arrays;

/**
 * 强盗抢劫
 * Find recursive relation
 * Recursive (top-down)
 * Recursive + memo (top-down)
 * Iterative + memo (bottom-up)
 * Iterative + N variables (bottom-up)
 */
public class _198_rob {
    // 1. Recursive (top-down)

    /**
     * 选择rob当前i:则nums[i-2] + nums[i]
     * 不选择当前i:则nums[i-1]
     */
    private static int rob1(int[] nums, int i){
        if (i < 0){
            return 0;
        }
        return Math.max(rob1(nums, i-2) + nums[i], rob1(nums, i-1));
    }
    public static int rob1(int[] nums){

        return rob1(nums, nums.length-1);
    }

    //2. Recursive + memo (top-down)(备忘录法去除重复值)
    public static int rob2(int[] nums){
        int n = nums.length;
        int[] mem = new int[n+1];
        Arrays.fill(mem, -1);
        return  rob2(nums, n-1, mem);
    }
    private static int rob2(int[] nums, int i, int[] mem){
        if (i < 0){
            return 0;
        }
        if (mem[i] >= 0){
            return mem[i];
        }
        int res = Math.max(rob1(nums, i-2) + nums[i], rob1(nums, i-1));
        mem[i] = res;
        return res;
    }

    /**
     * 3. 动态规划(bottom-top)
     */
    public static int rob(int[] nums){
        int n = nums.length;
        int[] dp = new int[n];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for (int i = 2; i < n; i++){
            dp[i] = Math.max(dp[i-2] + nums[i], dp[i-1]) ;
        }
        return dp[n-1];
    }

    public static void main(String[] args) {
        int[] nums = {2, 7, 9, 3, 1};
        int[] nums2 = {2, 1, 1, 2};
        System.out.println(rob2(nums2));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值