• 198/213动态规划之打家劫舍系列


    这两天在学习的时候,发现有个打家劫舍的题目,有意思的很,分享给大家。

    基础题目

    题目内容

    198. 打家劫舍

    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警
    给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

    示例 1:
    输入:[1,2,3,1]
    输出:4
    解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
    偷窃到的最高金额 = 1 + 3 = 4 。
    示例 2:
    输入:[2,7,9,3,1]
    输出:12
    解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
    偷窃到的最高金额 = 2 + 9 + 1 = 12 。

    提示

    • 1 <= nums.length <= 100
    • 0 <= nums[i] <= 400
    题解
    /*
    使用动态规划,简单
    */
    class Solution {
        public int rob(int[] nums) {
            int n = nums.length;
            if(n==1){
                return nums[0];
            }
            // f[i]表示进入第i个门能偷取到的最大金额
            int[] f = new int[n];
            f[0]=nums[0];
    
            f[1]=Math.max(nums[0],nums[1]);
            for(int i = 2;i<n;i++){
               f[i]=Math.max(f[i-2]+nums[i],f[i-1]);
            }
            return f[n-1];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    进阶题目

    213. 打家劫舍 II
    在上一题的基础上,加了个条件 这些房子首尾相连 ,这就涉及到第一个房子选与不选的问题,给f数组加一个维度,来表示第一个房子是否选择。

    class Solution {
       public int rob(int[] nums) {
           int n = nums.length;
           if(n==1 ){
               return nums[0];
           }else if (n==2){
               return Math.max(nums[0],nums[1]);
           }
           // f[i][0]表示进入第1个门时,进入第i个门能偷取到的金额
           // f[i][1]表示不进入第1个门时,进入第i个门能偷取到的金额
           int[][] f = new int[n][2];
           f[0][0]=0;
           f[0][1]=nums[0];
    
           f[1][0]=nums[1];
           f[1][1]=nums[0];
    
           for(int i = 2;i<n;i++){
               for(int j = 0;j<=1;j++){
                   if(i==n-1 && j==1){
                       // 最后一个元素取了,第一个元素没取
                       f[i][j]=f[i-1][j];
                   }else{
                       // 其他情况,非环形处理
                       f[i][j]=Math.max(f[i-2][j]+nums[i],f[i-1][j]);  
                   }
               }
           }
           return Math.max(f[n-1][0],f[n-1][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
    • 30
    • 31

    更多内容

  • 相关阅读:
    【Zabbix监控二】之zabbix自定义监控内容案例(自动发现、自动注册)
    恶意代码防范技术笔记(三)
    ES可视化工具--ElasticHD--下载、安装、使用
    希望计算机专业同学都知道这些宝藏博主
    闪电连接算法之Python实现
    stm32 I2C结构体解析
    java 实现链表
    风控模型启用前的最后一道工序,80%的童鞋在这都踩坑
    java计算机毕业设计租车管理系统源码+mysql数据库+系统+部署+lw文档
    qt 中保存图片,图片的名字,按照时间来保存
  • 原文地址:https://blog.csdn.net/weixin_43605736/article/details/132735208