ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P46-打家劫舍-动态规划-迭代

2022-04-11 14:31:06  阅读:159  来源: 互联网

标签:index return 迭代 递归 nums int length P46 打家劫舍


//打家劫舍
/*
* 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是
* 相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
* 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下,一夜之内能够偷窃到的最高金额
* */
public class P47 {
    public static void main(String[] args) {
//        int[] nums = new int[]{1,2,3,1};        //4
        int[] nums = new int[]{2,7,9,3,1};        //12
        System.out.println(maxMoney(nums, nums.length-1));
        System.out.println(maxMoney2(nums));
        System.out.println(maxMoney3(nums));
    }

    //递归
    public static int maxMoney(int[] nums, int index){
        if(nums == null || index < 0){  //递归出口
            return 0;
        }
        if(index == 0){
            return nums[0];
        }

        //递推公式,i-1 和 i-2+nums[i]的最优解
        return Math.max(maxMoney(nums, index-1), maxMoney(nums, index-2)+nums[index]);
    }

    //存在重复计算,左边会递归i-1,i-2,i-3,右边也同样i-2、i-3...
    //把递归的陪一次记录存起来,就是动态规划中的DP数组
    //用递归就是dp有值得时候直接取,没值得时候递归,就避免重复递归的问题

    //动态规划-迭代(不用递归)
    public static int maxMoney2(int[] nums){
        int length = nums.length;
        if(nums == null || length == 0){
            return 0;
        }
        if(length == 1){
            return nums[0];
        }

        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        //有了0和1这两个数,就可以推断其他数
        //迭代
        for(int i=2; i<length; i++){
            dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]);     //递推公式
        }

        return dp[length-1];        //最后位置就是最优解
    }

    //上面的方法占用空间复杂度高,有些数据存起来但又不使用
    //优化
    public static int maxMoney3(int[] nums){
        int length = nums.length;
        if(nums == null || length == 0){
            return 0;
        }
        if(length == 1){
            return nums[0];
        }

        int first = nums[0];
        int second = nums[1];
        for(int i=2; i<length; i++){
            int temp = second;
            second = Math.max(first+nums[i], second);
            first = temp;
        }

        return second;
    }
}

 

标签:index,return,迭代,递归,nums,int,length,P46,打家劫舍
来源: https://www.cnblogs.com/YonchanLew/p/16129886.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有