代码随想录 Day40 动态规划08 LeetCodeT198打家劫舍 T213打家劫舍II T337 打家劫舍III

news2024/12/22 19:54:14

动规五部曲:

1.确定dp数组含义

2.确定递推公式

3.初始化dp数组

4.确定遍历顺序

5.打印数组排错

LeetCode T198 打家劫舍

题目链接:198. 打家劫舍 - 力扣(LeetCode)

题目思路:

今天我们走出背包问题,开始进入新一轮经典问题的学习:打家劫舍问题.

题目大概含义就是我们不能在相邻的两间房子偷东西,最后要求我们得到的最大钱数是多少,我们仍然使用动规五部曲来分析问题

1.确定dp数组含义

dp[i]偷到这一家获得的最大钱数(包含这一家,但是偷不偷不知道)所以我们可以理解为考虑而不是一定包含在内.

2.确定递推公式

就是取决于这一家偷或者不偷之间取得的最大值

dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1])

3.初始化dp数组

由于取值取决于前两家的价值,所以这里我们初始化前两个元素

dp[0] = nums[0];

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

4.确定遍历顺序

从前向后遍历,因为后面的取决于前面元素的产生

5.打印数组排错

题目代码:

class Solution {
    public int rob(int[] nums) {
        if(nums.length == 1){
            return nums[0];
        }
        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] = Math.max(nums[i]+dp[i-2],dp[i-1]);
        }
        return dp[nums.length-1];

    }
}

LeetCode T213 打家劫舍II

题目链接:213. 打家劫舍 II - 力扣(LeetCode)

题目思路:

这题其实就是在第一题的思路上加上了一个环,首尾相连,这样我们其实就是考虑两种情况即可,一个是包含头,那么就不能包含尾了,因为这里其实就是首尾是相邻的,所以就是将去头和去尾的数组重新进行第一题的打家劫舍操作,最后取最大值即可.

题目代码:

class Solution {
    public int rob(int[] nums) {
        if(nums.length == 1){
            return nums[0];
        }
        if(nums.length == 2){
            return Math.max(nums[0],nums[1]);
        }
        int[] tmp = new int[nums.length-1];
        int[] tmp1 = new int[nums.length-1];
        System.arraycopy(nums,0,tmp,0,nums.length-1);
        System.arraycopy(nums,1,tmp1,0,nums.length-1);
        return Math.max(rub1(tmp1),rub1(tmp));

    }
    public int rub1(int[] nums){
        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] = Math.max(nums[i]+dp[i-2],dp[i-1]);
        }
        return dp[nums.length-1];

    }
}

LeetCode T337 打家劫舍III

题目链接:337. 打家劫舍 III - 力扣(LeetCode)

题目思路:

树形dp的入门题,我们要使用二叉树那里的递归+动态规划来解决问题

1.确定递归参数和返回值

这里我们要求一个节点 偷与不偷的两个状态所得到的金钱,那么返回值就是一个长度为2的数组。我们规定dp[0]表示不偷,dp[1]表示偷

2.确定终止条件

当遇到空节点时,直接返回dp数组即可

3.确定遍历顺序

后序遍历,因为我们要获取左节点偷与不偷的情况和右节点偷与不偷的情况返回给父节点.

4.确定单层递归逻辑

此时就是父节点偷或者不偷

dp[0]就是不偷,就直接考虑左节点偷与不偷的最大值加上右节点偷与不偷的最大值.

dp[1]就是偷,就直接用该节点的值加上左节点不偷,右节点不偷的最大值

题目代码:

class Solution {
    public int rob(TreeNode root) {
        int[] res = robAction(root);
        return Math.max(res[0],res[1]);

    }
    public int[] robAction(TreeNode cur){
        int[] res = new int[2];
        if(cur == null){
            return res;
        }
        int[] dp_left = robAction(cur.left);
        int[] dp_right = robAction(cur.right);

        //不偷他就在左右都偷相加
        res[0] = Math.max(dp_left[0],dp_left[1])+Math.max(dp_right[0],dp_right[1]);
        res[1] = cur.val + dp_left[0] + dp_right[0];
        return res;
    }
}

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

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

相关文章

8款提高小团队协作效率的app软件,你用过几款?

团队协作在当下的职场中变得司空见惯&#xff0c;当不同的头脑相聚到一起&#xff0c;很快就会产生新的项目想法&#xff0c;并为最棘手的挑战找到解决方案。因此&#xff0c;当整个团队参与决策时&#xff0c;这是成功的保证。 然而&#xff0c;要达到这种程度的协调往往会感…

【广州华锐互动】VR影视制片虚拟仿真教学系统

随着虚拟现实(VR)技术的不断发展&#xff0c;VR在影视制片教学中的应用场景也变得越来越丰富。本文将介绍VR在影视制片教学中的常见应用场景及其意义&#xff0c;并通过案例分析来更好地展示其应用前景。 在影视制片教学中&#xff0c;VR可以提供一种沉浸式的制作体验。其中&am…

你真的会开发测试框架?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

STM32两轮平衡小车原理详解(开源)

一、引言 关于STM32两轮平衡车的设计&#xff0c;我想在读者阅读本文之前应该已经有所了解&#xff0c;所以本文的重点是代码的分享和分析。至于具体的原理&#xff0c;我觉得读者不必阅读长篇大论的文章&#xff0c;只需按照本文分享的代码自己亲手制作一辆平衡车&#xff0c…

SPASS图表的制作

基础条形图搭建 打开数据集 变量设置 点击图形->图形构建器&#xff0c;确认 然后设置标题 最终结果展示如图&#xff1a; 自我构建条形图 展示的结果如下&#xff1a;

【Node.js入门】1.2 部署Node.js开发环境

1.2 部署Node.js开发环境 在 Windows 系统上安装 Node.js 两种文件格式的安装包 Windows安装包&#xff08;.msi&#xff09;Windows二进制文件&#xff08;.exe&#xff09;安装包 检查Node.js版本 node --version 在 Linux 系统上安装 Node.js Linux操作系统上安装Nod…

自然语言处理(一):RNN

「循环神经网络」&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一个非常经典的面向序列的模型&#xff0c;可以对自然语言句子或是其他时序信号进行建模。进一步讲&#xff0c;它只有一个物理RNN单元&#xff0c;但是这个RNN单元可以按照时间步骤进行展开…

发电机综合特性测试仪

发电机综合特性测试仪是可以测量发电机的电压、电流、功率因数、频率等参数&#xff0c;以评估发电机的质量和性能。可以测量发电机的输出电压&#xff0c;以确保其符合规定的标准和要求。测量发电机的输出电流&#xff0c;以确定其负载能力和稳定性。可以测量发电机的功率因数…

我是如何快速入门音视频开发的?

最近有读者留言&#xff0c;说“想转行音视频开发&#xff0c;怎么做”&#xff0c;正巧&#xff0c;前几天我还在知乎上&#xff0c;看到有人在问音视频的学习资料&#xff0c;还是个大一的学生。 想说一句&#xff1a;真有眼光。 如今这个时代&#xff0c;想赚钱&#xff0c…

2010年07月13日 Go生态洞察:通过通信来共享内存

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

霍尼韦尔pda手持终端 移动护理终端pda扫描手持机

pda手持终端的特点&#xff1a;具有数据存储及计算能力&#xff0c;能与其它设备进行数据通讯&#xff0c;具有 专业条码扫描&#xff0c;能够快速、准确采集各种一/二维码、破损码、弯折码、屏幕码等光学图形条码。有可拆卸4600mAh聚合物锂电池&#xff0c;续航有保障。 And…

【小白专用】VSCode下载和安装与配置PHP开发环境(详细版) 23.11.08

1. 下载VSCode2. 解决VSCode下载速度特别慢3. 安装VSCode 一、VSCode介绍 VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统。 二、官方下载地址…

剑指JUC原理-15.ThreadLocal

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

基于指数分布算法的无人机航迹规划-附代码

基于指数分布算法的无人机航迹规划 文章目录 基于指数分布算法的无人机航迹规划1.指数分布搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用指数分布算法来优化无人机航迹规划。 …

传感器融合是什么?及其类型和应用

什么是传感器融合&#xff1f; 目前&#xff0c;几乎各行各业都在使用传感器&#xff1a;在汽车、工厂&#xff0c;甚至我们的智能手机中&#xff0c;都有传感器的身影。虽然单个传感器本身就可以提供有用的数据&#xff0c;但如何能同时从多个传感器的输出中提取信息呢&#…

Bean的四种实例化方式以及BeanFactory和FactoryBean的区别

2023.11.8 Spring为Bean提供了多种实例化方式&#xff0c;通常包括4种方式。 第一种&#xff1a;通过构造方法实例化第二种&#xff1a;通过简单工厂模式实例化第三种&#xff1a;通过factory-bean实例化第四种&#xff1a;通过FactoryBean接口实例化 通过构造方法实例化 创…

MySQL基础操作

注:mysql是大小写不敏感的. 1.数据库基础操作(展示) //1.展示当前数据库 show databases;//2.创建数据库 create database 数据库名;//3.使用数据库 use 数据库名;//4.删除数据库 drop database 数据库名;2.SQL中基本类型 2.1 数值类型(整数和浮点型) 注:decimal和numeric…

cortex-A7核IIC实验--采集温湿度传感器的值

1.IIC总线---同步串行半双工 1&#xff09;一根数据线SDA--PF15&#xff0c;一根时钟线SCL--PF14 2&#xff09;传输速率&#xff1a;低速&#xff1a;100K 中速&#xff1a;400K 全速&#xff1a;3.4M 3&#xff09;外接两个上拉电阻的作用&#xff1a;总线空闲状态时&am…

浅谈顺序表基本操作

&#x1f937;‍♀️&#x1f937;‍♀️&#x1f937;‍♀️ 今天给大家带来的是数据结构——顺序表的实现(增删查改)。 清风的CSDN博客主页 &#x1f389;欢迎&#x1f44d;点赞✍评论❤️收藏 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff…

刷题笔记day14-二叉树01

前序遍历 前序遍历的方式是&#xff1a;根节点、左节点、右节点。 /*** Definition for a binary tree node.* type TreeNode struct {* Val int* Left *TreeNode* Right *TreeNode* }*/ import "container/list"func preorderTraversal(root *TreeNode…