一篇文章带你用动态规划解决打家劫舍问题

news2024/11/25 2:47:42

动态规划的解题步骤可以分为以下五步,大家先好好记住

1.创建dp数组以及明确dp数组下标的含义  2.制定递推公式  3.初始化  4.遍历顺序  5.验证结果


根据打家劫舍的题意:两个直接相连的房子在同一天晚上被打劫会触发警报

所以我们制定出核心策略——偷东西只能隔一家偷!

接下来只要记住核心思想,围绕这个思想来解题就可以了!

核心思想 :如果偷了这家那么上一家就不能偷,如果不偷这一家那么上一家就可以偷

首先看第一题

198. 打家劫舍

这是一道标准的打家劫舍问题

运用动态规划解题步骤结合核心代码来进行解题

    public int rob(int[] nums) {
        int n = nums.length;
        //dp数组下标的含义是抢劫到该房屋的最高金额
        int[] dp = new int[n];
        //递推公式:dp[i] = Math.max(nums[i-1] + dp[i-2],dp[i-1]);
        //初始化
        dp[0] = nums[0];
        //遍历顺序 从后向前遍历
        for(int i = 1;i < n;i++){
            if(i >= 2){
                dp[i] = Math.max(nums[i] + dp[i-2],dp[i-1]);
            }else{
                dp[i] = Math.max(nums[i],dp[i-1]);
            }

        }
        //验证
        return dp[n-1];
    }

213. 打家劫舍 II

这道题实际上是第一题的变招(看起来把屋子围起来了让小偷偷到钱财的难度增加了,但实际上小偷只需要转变一下思路也可以偷到很多钱 ^ ^ )

由于屋子围了起来,所以第一间屋子和最后一屋子现在是相邻的了

如果还是像刚才一样从头偷到尾那肯定是行不通的了。但是如果我避开这个第一间屋子和最后一屋子现在是相邻的了”这个条件是不是还是从头偷到尾呢?

答案是可以的,以题目的示例二举例

现在我们只需要指定两套方案,一套是从第一间偷到倒数第二间房子,另一套是从第二间偷到最后一间房子,然后比较两套方案哪个偷到的金额更大即可

接下来结合这个思想以及核心代码来编写代码

    public int rob(int[] nums) {
        if(nums.length == 0 || nums == null){
            return 0;
        }

        if(nums.length == 1){
            return nums[0];
        }

        if(nums.length == 2){
            return Math.max(nums[0],nums[1]);
        }
        

        return Math.max(robMaxNumber(0,nums.length - 2,nums),robMaxNumber(1,nums.length - 1,nums));
    }

    public int robMaxNumber(int start,int end,int[] nums){
        if(start == end){
            return nums[start];
        }
        
        int[] dp = new int[nums.length];

        dp[start] = nums[start];
        dp[start + 1] = Math.max(nums[start] , nums[start+1]);

        for(int i = start + 2;i <= end;i++){
            dp[i] = Math.max(dp[i-2] + nums[i],dp[i - 1]);
        }

        return dp[end];
    }

337. 打家劫舍 III

这道题还是有点难度的,既用到了动态规划又用到了二叉树的知识,但是结合上核心思想还是很简单的

根据题意两个直接相连的房子在同一天晚上被打劫结合核心思想

如果偷了孩子节点那么父节点就不能偷了,如果偷了父节点那么子节点就不能偷了

我们可以用一个二维数组来表达偷了该节点所获得的最大金额以及不偷该节点所获得最大金额

//0表示不偷该节点 1表示偷该节点
int[][] res = new int[2][1];

到这里动态规划需要解决的问题就解决了 

ok解决完动态规划的部分接下来来看二叉树的部分需要解决的问题 —— 遍历顺序

由于我们先要知道孩子节点的情况才能做出下一步判断

所以我们使用后序遍历的方式对树进行遍历

解决完两个难点接下来结合核心思想来编写代码

    public int rob(TreeNode root) {
        int[][] result = robHelper(root);
        return Math.max(result[0][0],result[1][0]);
    }
    public int[][] robHelper(TreeNode root) {
        //表示偷还是不偷
        int[][] res = new int[2][1];
        //遇到空节点返回
        if(root == null){
            return res;
        }
        //从底部向上遍历所以是后序遍历
        int[][] left = robHelper(root.left);
        int[][] right = robHelper(root.right);
        //不偷父节点所以要获取孩子节点的最大值
        res[0][0] = Math.max(left[0][0],left[1][0]) + Math.max(right[0][0],right[1][0]);
        //偷父节点所以不能偷孩子节点了
        res[1][0] = left[0][0] + right[0][0] + root.val;
        return res;

    }

总的来说只要结合了核心思想“偷这个就不能偷那个” 打家劫舍问题还是很简单的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1091713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Generalizable NeRF in ICCV‘23

文章目录 前置知识Generalizable《Enhancing NeRF akin to Enhancing LLMs: Generalizable NeRF Transformer with Mixture-of-View-Experts》《WaveNeRF: Wavelet-based Generalizable Neural Radiance Fields》NeO 360: Neural Fields for Sparse View Synthesis of Outdoor …

习题2.18

有点烦了&#xff0c;改个次序做题发博文。今天先发2.18 题目很简单 将列表反序。用clojure来写&#xff0c;还是有点不习惯。忽然想起来&#xff0c;以前面试遇到过面试题&#xff0c;要求用递归函数对数组反序。原来就是想考察这些内容。 因为源语言已经有提供reverse&#…

2023最新接口自动化测试面试题

1、get和post的区别&#xff1f; l http是上层请求协议&#xff0c;主要定义了服务端和客户端的交互规格&#xff0c;底层都是tcp/ip协议 l Get会把参数附在url之后&#xff0c;用&#xff1f;分割&#xff0c;&连接不同参数&#xff0c;Get获取资源&#xff0c;post会把…

Python安装和环境配置教程

进官网根据不同的操作系统&#xff0c;下载适合自己的编译环境&#xff08;在百度里直接输入Python&#xff09; 选择安装包&#xff08;我选择的是3.8.0版本&#xff09; python官方下载目录中有好多种安装方式&#xff0c;一般情况选择Windows x86-64 executable installer …

酒水茶叶经营小程序商城的作用是什么

酒水茶叶的用户群体非常广&#xff0c;其价格从低到高覆盖了很多人群&#xff0c;对酒厂茶商或经销商来说&#xff0c;在市场高需求的同时&#xff0c;其所遇经营难题也比较明显。 通过【雨科】平台搭建酒水茶叶商城&#xff0c;实现商品线上自营售卖&#xff0c;电脑手机端小程…

缩短从需求到上线的距离:集成多种工程实践的稳定框架 | 开源日报 No.55

zeromicro/go-zero Stars: 25.7k License: MIT go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性&#xff0c;经受了充分的实战检验。 go-zero 包含极简的 API 定义和生成工具 goctl&#xff0c;可以根据定义的 api 文件一键生成…

【git】500 Whoops, something went wrong on our end.

在访问公的的git 时出现了500错误提示. 500 Whoops, something went wrong on our end. 哎呀&#xff0c;我们这边出了问题。 TMD 出了什么问题了&#xff1f;&#xff1f;&#xff1f;一脸懵逼。 登录git 服务器。 查看git的状态。 命令&#xff1a; gitlab-ctl statu…

【AI视野·今日Sound 声学论文速览 第二十四期】Thu, 12 Oct 2023

AI视野今日CS.Sound 声学论文速览 Thu, 12 Oct 2023 Totally 12 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Enhancing expressivity transfer in textless speech-to-speech translation Authors Jarod Duret LIA , Benjamin O Brien LIA , Yanni…

【C++】 局部对象,引用返回

1、new 关键字 会在堆内申请空间&#xff0c;如果仅仅是普通调用构造函数&#xff0c;不会在堆内开辟空间。 2、函数调用会形成栈帧&#xff0c;进行压栈操作&#xff0c;函数调用结束&#xff0c;会进行弹栈。 函数内的局部对象&#xff0c;会随着弹栈&#xff0c;而被销毁(…

关于github申请学生认证-卡在证明上传环节解决方案

在持有学信网英语翻译&#xff08;30&#xff09;某宝请人代注册(80) 通过github security log和聊天记录我大致猜想了下做法&#xff0c;前面的学校邮箱其实都好说主要是下面的那个上传照片的环节卡了我很久

生活空间中,餐桌该如何选择?福州中宅装饰,福州装修

餐桌设计 如何选择 不同的餐桌&#xff0c;定义不同的餐桌礼仪 在家的装修设计上&#xff0c; 很多人的关注点是这样的&#xff1a; 玄关收纳要强、客厅颜值要高、阳台功能要全、厨房要好用、卧室要舒适......餐厅、几把椅子一张长桌&#xff0c;够了吧。 餐厅说&#xff1a;“…

20.2 FMC驱动SDRAM的时序初始化实现及内存测试

继续上一篇的话题&#xff0c;写到SDRAM通过CubeMx配置后&#xff0c;在工程代码编写时直接引用的是我事先写好的时序初始化、内存测试文件&#xff0c;而未对其进行详细的解释&#xff0c;所以本篇文章就来娓娓道来。不多说&#xff0c;开始吧 SDRAM的初始化流程简述 SDRAM初…

在不同版本的linx编译erLang时出现./configure使用--prefix指定路径后,总在指定的另前多了/usr/local路径

昨天别的项目同事遇到一个编译遇到在不同linx版本下编译erLang的源码时&#xff0c;其中有一个版本的编译出现在./configure时加入---prefix指定编译后的安装目录&#xff0c;总会在指定的安装另前多了/usr/local的目录&#xff0c;导致无法源码安装到普通用户指定的目录 安装…

目录启示:使用 use 关键字为命名空间内的元素建立非限定名称

文章目录 参考环境三种名称非限定名称限定名称完全限定名称举个栗子 useuse 关键字use ... as .. 命名冲突真假美猴王两个世界 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型、ChatGPTPHP 官方PHP ManualPHP 官方language.namespaces.ra…

乐器经营商城小程序的作用是什么

乐器产品覆盖的人群非常广&#xff0c;小学生、老年人都有不小需求&#xff0c;也因此市场中的从业商家相对较多&#xff0c;产品丰富可供消费者选购&#xff0c;然而在实际经营中&#xff0c;线上线下面临痛点不少。 通过【雨科】平台搭建乐器小程序商城&#xff0c;将所有产品…

数据中心机房供电配电及能效管理系统设计

安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁 摘要&#xff1a;现代的数据中心中都包括大量的计算机&#xff0c;对于这种场所的电力供应&#xff0c;都要求供电系统需要在所有的时间都有效&#xff0c;这就不同于一般建筑的供配电系统&#xff0c;它是一个交叉的系统&#xff0c;涉及…

力扣第108题 将有序数组转二叉搜索树 c++

题目 108. 将有序数组转换为二叉搜索树 简单 相关标签 树 二叉搜索树 数组 分治 二叉树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树…

Python基础教程:print输出带颜色的方法详解

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 书写格式&#xff1a; 开头部分&#xff1a;\033[显示方式;前景色;背景色m 结尾部分&#xff1a;\033[0m 注意&#xff1a; 开头部分的三个参数&#xff1a;显…

Android ViewBinding和DataBinding功能作用区别

简述 ViewBinding和DataBinding都是用于在 Android 应用程序中处理视图的工具&#xff0c;但它们有不同的作用和用途。 ViewBinding: ViewBinding 是 Android Studio 的一个工具&#xff0c;用于生成一个绑定类&#xff0c;能够轻松访问 XML 布局文件中的视图。ViewBinding 为…

整理mongodb文档:搭建分片集群

个人博客 整理mongodb文档:搭建分片集群 分片集群在MongoDB中的的使用并没有那么多&#xff0c;更多的还是副本集&#xff0c;所以本文就不讲解那么多&#xff0c;只是搭建一个最基本的分片集群&#xff0c;让大家有个了解。个人公众号&#xff0c;求关注。 文章概叙 本文主…