代码随想录第34天:动态规划7(打家劫舍问题:链式、环式、树式房屋)
一、背包问题小结
1.递推公式:
1.问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
2.问装满背包有几种方法:dp[j] += dp[j - nums[i]]
3.问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
4.问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j])
2.遍历顺序:
1.01背包:“二维”顺序随便,“一维”只能先物品后背包,且背包逆序遍历
2.完全背包:先物品后背包求组合,先背包后物品求排列。
二、打家劫舍(Leetcode 198)
1.确定dp数组以及下标的含义
dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。
2.确定递推公式
偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。
如果不偷第i房间,那么dp[i] = dp[i - 1]
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
3.dp数组初始化
dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])
4.确定遍历顺序
dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,从前到后遍历
class Solution:def rob(self, nums: List[int]) -> int:# 边界情况处理:如果没有房子,收益为 0if len(nums) == 0:return 0# 如果只有一间房子,直接抢它if len(nums) == 1:return nums[0]# 初始化 DP 数组,长度为 len(nums) + 1,dp[i] 表示抢前 i 个房子的最大金额dp = [0] * (len(nums) + 1)# 初始化前两个状态:# dp[0] 实际代表抢第 0 个房子的最大收益(即 nums[0])# dp[1] 是抢第 0 和第 1 个房子中最大值(只能选一个)dp[0], dp[1] = nums[0], max(nums[0], nums[1])# 从第三个房子开始迭代for i in range(2, len(nums)):# 状态转移方程:# 要么不抢当前房子(dp[i - 1]),要么抢当前房子加上 i-2 的最优值(dp[i - 2] + nums[i])dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])# 返回抢到最后一间房子的最大收益return dp[len(nums) - 1]
空间优化版:将O(N)复杂度优化为O(1)
class Solution:def rob(self, nums: List[int]) -> int:# 边界处理:如果没有房子可抢if not nums:return 0# 如果只有一间房子,直接返回其金额if len(nums) == 1:return nums[0]# 初始化两个变量用于存储前两个位置的最大收益prev2 = nums[0] # dp[i - 2],抢第0间房子的最大收益prev1 = max(nums[0], nums[1]) # dp[i - 1],前两间房子中选择收益最大的# 从第3间房子开始遍历for i in range(2, len(nums)):# 状态转移:要么不抢当前房子(继承上一个的最大值),# 要么抢当前房子(加上前前一间房子的最大值)curr = max(prev1, prev2 + nums[i])# 更新状态,为下次迭代准备prev2, prev1 = prev1, curr# 最终的最大收益在 prev1 中return prev1
三、打家劫舍(Leetcode 213)
思路:因为首尾相邻,所以我们不能同时选择第一间和最后一间。所以将问题拆解为两个子问题:
-
抢劫第
0 ~ n-2
间房(不包含最后一间)————> nums[:n - 1] -
抢劫第
1 ~ n-1
间房(不包含第一间)————> nums[1:]
两者取最大值即可。相当于利用”打家劫舍198题“算2次取max
class Solution:def rob(self, nums: List[int]) -> int:# 如果输入列表为空,返回0,因为没有房屋可以抢劫if len(nums) == 0: return 0# 如果列表只有一个房屋,返回该房屋的金额if len(nums) == 1: return nums[0]# 定义一个辅助函数,解决线性排列的房屋抢劫问题def solve(arr):# pre_2 表示前两个房屋的最大抢劫金额,pre_1 表示前一个房屋的最大抢劫金额pre_2, pre_1 = 0, 0# 遍历数组中的每个房屋for i in arr:# 当前房屋的最大金额 = max(不抢当前房屋只取前一个,抢当前房屋加上前两个)cur = max(pre_1, pre_2 + i)# 更新 pre_2 和 pre_1,为下一次迭代做准备pre_2, pre_1 = pre_1, cur# 返回最后一个房屋考虑后的最大金额return pre_1# 由于首尾房屋不能同时抢劫,比较两种情况:# 1. 抢劫从第2个房屋到最后一个房屋(nums[1:])# 2. 抢劫从第1个房屋到倒数第二个房屋(nums[:-1])# 取两者的最大值return max(solve(nums[1:]), solve(nums[:-1]))
def solve(arr):pre_2, pre_1 = 0, 0for i in arr:cur = max(pre_1, pre_2 + i)pre_2, pre_1 = pre_1, curreturn pre_1
为什么不返回 cur?
因为 cur 是临时变量,它是当前轮次刚计算出来的值,更新完之后才赋值给 pre_1。
而 pre_1 一直记录的是截至当前位置的最优解,是我们想要的答案。
四、打家劫舍(Leetcode 337)
1.确定递归函数的参数和返回值
这里我们要求一个节点 偷与不偷的两个状态所得到的金钱,那么返回值就是一个长度为2的数组。
2.确定终止条件
在遍历的过程中,如果遇到空节点就返回
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = rightclass Solution:def rob(self, root: Optional[TreeNode]) -> int:# 定义辅助函数,返回一个元组 (rob, not_rob)# rob: 抢劫当前节点时的最大金额# not_rob: 不抢劫当前节点时的最大金额def dfs(node):# 基本情况:如果节点为空,返回 (0, 0)if not node:return 0, 0# 递归处理左子树和右子树left_rob, left_not_rob = dfs(node.left)right_rob, right_not_rob = dfs(node.right)# 抢劫当前节点:不能抢劫左右子节点,取左右子节点的 not_rob 值rob_current = node.val + left_not_rob + right_not_rob# 不抢劫当前节点:可以选择抢或不抢左右子节点,取最大值not_rob_current = max(left_rob, left_not_rob) + max(right_rob, right_not_rob)# 返回当前节点的两种情况的最大金额return rob_current, not_rob_current# 调用 dfs,返回抢或不抢根节点的最大值rob_root, not_rob_root = dfs(root)return max(rob_root, not_rob_root)
相关文章:
代码随想录第34天:动态规划7(打家劫舍问题:链式、环式、树式房屋)
一、背包问题小结 1.递推公式: 1.问能否能装满背包(或者最多装多少):dp[j] max(dp[j], dp[j - nums[i]] nums[i]) 2.问装满背包有几种方法:dp[j] dp[j - nums[i]] 3.问背包装满最大价值:dp[j] max…...
网络安全自动化:找准边界才能筑牢安全防线
数字时代,企业每天要面对成千上万的网络攻击。面对庞大的服务器群、分散的团队和长期不重启的设备,很多企业开始思考:哪些安全操作适合交给机器自动处理?哪些必须由人工把关?今天我们就用大白话聊聊这件事。 一、这些事…...
ctfshow——web入门361~368
最近练习ssti 当 Web 应用程序使用模板引擎动态生成 HTML 页面或其他类型的输出时,如果用户输入未经过充分验证或转义就被直接嵌入到模板中,就可能发生 SSTI 攻击。攻击者可以利用这个弱点注入恶意模板代码,该代码将在服务器端执行。 常见的…...
备忘录模式(Memento Pattern)
🧠 备忘录模式(Memento Pattern) 备忘录模式 是行为型设计模式之一。它通过将对象的状态存储在一个备忘录中,允许对象在不暴露其内部结构的情况下,保存和恢复自己的状态。该模式允许将对象的状态保存到备忘录中&#…...
五一假期作业
sub_process.c #include <stdio.h> // 标准输入输出库 #include <pthread.h> // POSIX线程库 #include <sys/ipc.h> // IPC基础定义(如消息队列/共享内存) #include <sys/msg.h> // 消息队列操作相关…...
Multi Agents Collaboration OS:专属多智能体构建—基于业务场景流程构建专属多智能体
背景 随着人工智能技术的飞速发展,大型语言模型(LLM)的能力不断突破,单一智能体的能力边界逐渐显现。为了应对日益复杂的现实世界任务,由多个具备不同能力、可以相互协作的智能体组成的多智能体系统 (Multi-Agent Sys…...
数据库的二级索引
二级索引 10.1 二级索引作为额外的键 表结构 正如第8章提到的,二级索引本质上是包含主键的额外键值对。每个索引通过B树中的键前缀来区分。 type TableDef struct {// 用户定义的部分Name stringTypes []uint32 // 列类型Cols []string // 列名Indexes …...
湖北理元理律师事务所:债务法律服务的民生价值重构
当前我国居民杠杆率达62.3%(央行2023年数据),债务问题已从经济议题演变为社会议题。湖北理元理律师事务所通过构建覆盖咨询、备案、规划的全链条服务,试图在法律框架内探索债务危机的社会化解决方案。 民生导向的服务设计 1.阶梯…...
DotNetBrowser 3.2.0 版本发布啦!
包含来自 Chromium 135 的安全修复支持自定义用户代理客户端提示(User Agent Client Hints)在 Avalonia 离屏渲染模式中支持拖放(Drag & Drop)功能 🔗 点击此处了解更多详情。 🆓 免费试用 30 天。...
PyTorch 张量与自动微分操作
笔记 1 张量索引操作 import torch # 下标从左到右从0开始(0->第一个值), 从右到左从-1开始 # data[行下标, 列下标] # data[0轴下标, 1轴下标, 2轴下标] def dm01():# 创建张量torch.manual_seed(0)data torch.randint(low0, high10, size(4, 5))print(data->,…...
C语言数据在内存中的存储详解
在 C 语言的编程世界里,理解数据在内存中的存储方式是非常重要的,它能帮助我们更好地掌握数据类型、内存管理和程序性能优化等内容。今天,我就来给大家详细讲解数据在内存中的存储,包括整数、大小端字节序和浮点数的存储方式&…...
【AI大模型】SpringBoot整合Spring AI 核心组件使用详解
目录 一、前言 二、Spring AI介绍 2.1 Spring AI介绍 2.2 Spring AI主要特点 2.3 Spring AI核心组件 2.4 Spring AI应用场景 2.5 Spring AI优势 2.5.1 与 Spring 生态无缝集成 2.5.2 模块化设计 2.5.3 简化 AI 集成 2.5.4 支持云原生和分布式计算 2.5.5 安全性保障…...
linux-文件操作
在 Linux 系统中,文件操作与管理是日常使用和系统管理的重要组成部分。下面将详细介绍文件的复制、移动、链接创建,以及文件查找、文本处理、排序、权限管理等相关知识。 一、文件的复制 在 Linux 里,cp 命令可用于复制文件或目录ÿ…...
丢失的数字 --- 位运算
目录 一:题目 二:算法原理 三:代码实现 一:题目 题目链接: 268. 丢失的数字 - 力扣(LeetCode) 二:算法原理 三:代码实现 class Solution { public:int missingNumb…...
从Rtos到Linux:学习的策略
这里目的只是为了学习,哪天工作需要用上了能更顺利的上手,写文章的目的是为了记录和便于查询。工作的前两年主要是以mcu裸机为主,目的是压缩资源以最少的ram和flash实现最多的功能,后来五年做的东西越来越复杂的跑的rtosÿ…...
BUUCTF——Mark loves cat
BUUCTF——Mark loves cat 进入靶场 简单的看了一下功能点 扫一下目录吧 扫目录发现一个.git 下一下源码看看 找到个flag.php和index.php <?php$flag file_get_contents(/flag);再看看index.php(代码有点长,所以只留了后面有用的) &…...
C/C++滑动窗口算法深度解析与实战指南
C/C滑动窗口算法深度解析与实战指南 引言 滑动窗口算法是解决数组/字符串连续子序列问题的利器,通过动态调整窗口边界,将暴力解法的O(n)时间复杂度优化至O(n)。本文将系统讲解滑动窗口的核心原理、C/C实现技巧及经典应用场景,助您掌握这一高…...
Webug4.0靶场通关笔记15- 第19关文件上传(畸形文件)
目录 第19关 文件上传(畸形文件) 1.打开靶场 2.源码分析 (1)客户端源码 (2)服务器源码 3.渗透实战 (1)构造脚本 (2)双写绕过 (3)访问脚本 本文通过《…...
黑马点评大总结
8.2.1 短信登录 首先是用户提交手机号,后端将生成的验证码以及用户信息存入session中,用户登录时进行拦截并从session中拿出来信息校验,并把用户信息存入ThreadLocal中session共享问题:每个tomcat有自己的一份session,…...
LeetCode:返回倒数第k个结点
1、题目描述 实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 注意:本题相对原题稍作改动 示例: 输入: 1->2->3->4->5 和 k 2 输出: 4 说明: 给定的 k 保证是有效的。 2、…...
zotero pdf中英翻译插件使用
最近发现一个pdf中英翻译的神器zotero-pdf2zh,按照官方安装教程走一遍的时候,发现一些流程不清楚的问题, 此文就是整理一些安装需要的文件以及遇到的问题: 相关文件下载地址 Zotero 是一款免费的、开源的文献管理工具࿰…...
Java后端程序员学习前端之CSS
什么是css Cascading Style Sheet 层叠级联样式表 表现 (美化网页) 字体,颜色,边距,高度,宽度,背景图片,网页定位,网页浮动.. 发展史 CSS1.0 CSS2.0 DIV(块)CSS,HTML与CSS结构分离…...
MySQL——数据库基础操作
学习MySQL之前,要先配置好相关环境与软件下载,怎么就不展开了:找找网上对应环境下的教程即可 目录 数据库与MySQL 案例使用 MySQL架构 SQL指令分类 储存引擎 库操作 创建数据库 编码集与校验规则 校验规则的影响 删除数据库 数…...
[低代码 + AI] 明道云与 Dify 的三种融合实践方式详解
随着低代码平台和大语言模型工具的不断发展,将企业数据与智能交互能力融合,成为提高办公效率与自动化水平的关键一步。明道云作为一款成熟的低代码平台,Dify 则是一个支持自定义工作流的开源 LLM 应用框架。两者结合,可以实现灵活、高效的智能化业务处理。 本文将详解明道…...
湖北理元理律师事务所:规模化债事服务的探索与实践
在个人债务问题日益普遍化的当下,如何通过合法、系统化的服务帮助债务人化解危机,成为法律服务业的重要课题。湖北理元理律师事务所作为经国家司法局批准设立的债事服务机构,其构建的“法律技术金融”服务模式,为债务优化领域提供…...
MySQL JOIN详解:掌握数据关联的核心技能
一、为什么需要JOIN? 在关系型数据库中,数据通常被拆分到不同的表中以提高存储效率。当我们需要从多个表中组合数据时,JOIN操作就成为了最关键的技能。通过本文,您将全面掌握MySQL中7种JOIN操作,并学会如何在实际场景中…...
深入浅出数据库规范化的三大范式
数据库的“成长之路”:从1NF到3NF的规范化进化 在数据库的世界里,关系模式就像一个“孩子”,需要一步步学习“规矩”,才能健康成长。今天,我们就来聊聊数据库的规范化历程——从第一范式(1NF)出…...
精益数据分析(39/126):SaaS与移动应用商业模式的关键要点剖析
精益数据分析(39/126):SaaS与移动应用商业模式的关键要点剖析 在创业和数据分析的探索之旅中,每一次深入研究不同的商业模式都是一次宝贵的学习机会。今天,依旧怀揣着与大家共同进步的期望,深入解读《精益…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.3 数据脱敏与安全(模糊处理/掩码技术)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL数据脱敏实战:从模糊处理到动态掩码的全流程解析4.3 数据脱敏与安全:模糊处理与掩码技术深度实践4.3.1 数据脱敏的核心技术体系4.3.1.1 技…...
nginx面试题
nginx 返回状态码413 Nginx 状态码 413 表示“请求实体过大”(Request Entity Too Large),意味着客户端发送的请求体大小超过了服务器允许的限制。 解决方法 修改 Nginx 配置文件: 找到 Nginx 配置文件,通常位于 /etc…...
flink rocksdb状态说明
文章目录 1.默认情况2.flink中的状态3.RocksDB4.对比情况5.使用6.RocksDB架构7.参考文章8.总结提示:以下主要考虑flink 状态永久存储 rocksdb情况,做一些简单说明 1.默认情况 当flink使用rocksdb存储状态时。无论是永久存储还是临时存储都可能会落盘写文件(如果没有配置存储…...
Linux | WEB服务器的部署及优化
一. web服务的常用知识 1.1 www www(World Wide Web):即为万维网,常被称为“全球信息广播”。它是一种基于超文本和HTTP协议,能够将文字、图形、影像以及声音等多媒体信息,通过超链接的方式组织在一起&…...
Nginx正反向代理与正则表达式
目录 一:正向代理 1.编译安装nginx 2.配置正向代理 二:反向代理 1.配置nginx七层代理 2.配置nginx四层代理 三:nginx 缓存 1.缓存功能的核心原理和缓存类型 2.代理缓存功能设置 四:nginx rewrite 和正则表达式 1.Nginx…...
字节:LLM自动化证明工程基准
📖标题:APE-Bench I: Towards File-level Automated Proof Engineering of Formal Math Libraries 🌐来源:arXiv, 2504.19110 🌟摘要 🔸大型语言模型(LLM)的最新进展在形式定理证明…...
豆包多轮对话优化策略:上下文理解与记忆,意图识别,对话管理
豆包多轮对话优化策略:上下文理解与记忆,意图识别,对话管理 上下文理解与记忆:我会分析每一轮用户输入的文本内容,理解其中的语义、意图和关键信息,并将这些信息与之前轮次的对话内容相结合,形成对整个对话上下文的理解和记忆。例如,在一个关于旅游规划的对话中,用户先…...
ADK 第四篇 Runner 执行器
智能体执行器 Runner,负责完成一次用户需求的响应,是ADK中真正让Agent运行起来的引擎,其核心功能和Agents SDK中的Runner类似,具体作用如下: 会话管理:自动读取/写入 SessionService,维护历史信…...
yolo 用roboflow标注的数据集本地训练 kaggle训练 comet使用 训练笔记5
本地训练 8gb内存,机械硬盘用了4分钟训练完了 ........... model torch.hub.load(path/to/yolov5, custom, path./runs/train/exp10/weights/best.pt, sourcelocal) 连不上github kaggel训练 传kaggle了 # Train YOLOv5s on COCO128 for 3 epochs !python train…...
chili3d笔记11 连接yolo python http.server 跨域请求 flask
from ultralytics import YOLO from flask import Flask, request, jsonify from flask_cors import CORS import base64 from io import BytesIO from PIL import Image import json# 加载模型 model YOLO(./yolo_detect/best.pt)app Flask(__name__) CORS(app) # 启用跨域…...
安全为上,在系统威胁建模中使用量化分析
*注:Open FAIR™ 知识体系是一种开放和独立的信息风险分析方法。它为理解、分析和度量信息风险提供了分类和方法。Open FAIR作为领先的风险分析方法论,已得到越来越多的大型组织认可。 在数字化风险与日俱增的今天,企业安全决策正面临双重挑战…...
STA中的multi_cycle 和false_path详细讨论
特殊路径:跨时钟域下的exception_path:分为多种情况优先 1、不同clk_domain ,但频率相同 create_clock -name CLKM -period 10 -waveform {0 5} [get_ports CLKM] create_clock -name CLKP -period 10 -waveform {0 5} [get_ports CLKP] set_multicycl…...
Vite 的工作流程
Vite 的工作流程基于其创新的 “预构建 按需加载” 机制,通过利用现代浏览器对原生 ES 模块的支持,显著提升了开发效率和构建速度。以下是其核心工作流程的详细分析: 一、开发环境工作流程 1. 启动开发服务器 冷启动:通过 npm …...
NGINX 的 ngx_http_auth_jwt_module模块
一、模块概述 ngx_http_auth_jwt_module 模块用于通过验证请求中提供的 JWT 来进行客户端授权。此模块支持 JSON Web 签名(JWS)、JSON Web 加密(JWE)以及嵌套 JWT(Nested JWT),使其成为一种灵活…...
【Game】Powerful——Transformation Card(10)
文章目录 1 级卡片2 级卡片3 级卡片4 级卡片5 级卡片6 级卡片7 级卡片8 级卡片8.1、神兽8.2、珍兽 9、其他9.1、5 级变身卡9.2、8 级变身卡 10、PK 汇总物理 11、卡片合成 1 级卡片 千变万化等级要求:1 级 金钱龟,防御30⬆ 大耳兔,速度15⬆…...
【算法学习】递归、搜索与回溯算法(一)
算法学习: https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言: 这个专题与前面的相比是比较有难度的,但是在平时刷题时出现的概率还是非常高的,下面还是按照之前的逻辑来理清一下这几道…...
发行基础:上传版本注意事项
1、steam的规则是上传,提审,随时可更新。 2、基本流程:根据app id以及depot id,上传本地游戏文件到服务器,把分支版本设置为默认,发布。 试玩版与正式版的app id与depot id是相互独立的。 3、理论上开发者…...
智算中心建设方案和前景分析
智算中心建设方案和前景分析 一、智算中心的概念与重要性 1.1 定义与内涵 智算中心,即智能计算中心,是基于最新人工智能理论,采用领先的人工智能计算架构,专门为人工智能应用提供所需的算力服务、数据服务和算法服务的新型基础…...
亚马逊卖家复刻案例:用社群分层策略实现海外用户月均消费3.2次
近年来,随着跨境电商市场的快速发展,全球消费模式经历深刻变革。尤其是在美国、欧洲等成熟市场,中小卖家面对高度市场集中和运营成本上升的双重压力,纷纷寻求以更精细化的用户运营来提高客户复购率,增加单用户价值。20…...
小刚说C语言刷题—1038编程求解数学中的分段函数
1.题目描述 编程求解数学中的分段函数。 …………x1 (当 x>0 )。 yf(x)…0 (当 x0 )。 ………x−1 (当 x<0 )。 上面描述的意思是: 当x>0 时 yx1 ; 当 x0 时 y0 ; 当 x<0 时 yx−1 。 输入 输入一行,只有一个整数x(−30000≤x≤30…...
kotlin 03flow-stateFlow和sharedFlow企业中使用
一 stateFlow和sharedFlow企业中使用 在企业级 Kotlin 项目中,StateFlow 和 SharedFlow 是 状态管理 与 事件分发 的核心工具,尤其在 MVVM 架构中扮演着极为关键的角色。 ✅ 企业中如何使用 StateFlow 和 SharedFlow 场景工具示例UI 状态同步ÿ…...
【机器学习|学习笔记】决策树Decision Tree(DT)的起源、原理、发展、改进和应用(附代码)
【机器学习|学习笔记】决策树Decision Tree(DT)的起源、原理、发展、改进和应用(附代码) 【机器学习|学习笔记】决策树Decision Tree(DT)的起源、原理、发展、改进和应用(附代码) 文…...