动态规划三题:从一维到二维,递推 / 记忆化 / 空间优化

发布时间:2026/8/27 8:37:38

动态规划三题:从一维到二维,递推 / 记忆化 / 空间优化
三道题一脉相承一维选/不选→ 二维两串对齐→ 二维三种操作取 min。每题都给三种实现递推自底向上、记忆化递归自顶向下、空间优化。写在前面DP 四步心法不管哪道题都按这四步走绝不乱状态dp[...]表示什么转移dp[当前] ???盯住最后一步从哪来边界最小情况是几顺序保证依赖先算好一、打家劫舍一维 · 入门题目一排房子第i间有金额nums[i]相邻两间不能同时偷。求最大金额。nums [2, 7, 9, 3, 1]→ 答案12偷第 0、2、4 间291。思路盯住最后一步第i间要么偷、要么不偷。偷ii-1不能偷 →dp[i-2] nums[i]不偷i沿用dp[i-1]取较大者步答案状态dp[i] 前 i 间房能偷到的最大金额转移dp[i] max(dp[i-1], dp[i-2] nums[i])边界dp[0]nums[0],dp[1]max(nums[0], nums[1])填表nums[2,7,9,3,1]i 0 1 2 3 4 nums 2 7 9 3 1 不偷 - 2 7 11 11 偷 - - 11 10 12 dp 2 7 11 11 12 ← 答案dp 递推defrob_dp(nums):ifnotnums:return0iflen(nums)1:returnnums[0]dp[0]*len(nums)dp[0],dp[1]nums[0],max(nums[0],nums[1])foriinrange(2,len(nums)):dp[i]max(dp[i-1],dp[i-2]nums[i])returndp[-1]记忆化递归fromfunctoolsimportlru_cachedefrob_memo(nums):ifnotnums:return0lru_cache(maxsizeNone)defdfs(i):ifi0:returnnums[0]ifi1:returnmax(nums[0],nums[1])returnmax(dfs(i-1),dfs(i-2)nums[i])returndfs(len(nums)-1)空间优化两格滚动 O(1)dp[i]只依赖前两格用dp[0]/dp[1]两格 i%2交替即可。return max(dp)是因为打家劫舍的dp非递减两格里的大者就是末格。defrob_opt(nums):ifnotnums:return0iflen(nums)1:returnnums[0]dp[0,0]dp[0],dp[1]nums[0],max(nums[0],nums[1])foriinrange(2,len(nums)):dp[i%2]max(dp[(i-1)%2],dp[(i-2)%2]nums[i])returnmax(dp)二、最长公共子序列 LCS二维 · 中等题目给两个字符串求最长公共子序列不要求连续顺序不变。s1 abcde,s2 ace→ 答案3ace跳过 b、d。思路盯住末尾这对字符s1[i-1]与s2[j-1]相等这对匹配上dp[i][j] dp[i-1][j-1] 1不等丢s1[i-1]或丢s2[j-1]取较大max(dp[i-1][j], dp[i][j-1])步答案状态dp[i][j]s1前 i 个与s2前 j 个的 LCS 长度转移相等dp[i-1][j-1]1不等max(dp[i-1][j], dp[i][j-1])边界dp[0][*] dp[*][0] 0空串无公共部分填表abcde / ace a c e 0 0 0 0 a 0 1 1 1 b 0 1 1 1 c 0 1 2 2 d 0 1 2 2 e 0 1 2 3 ← 答案dp 递推deflcs_dp(s1,s2):m,nlen(s1),len(s2)dp[[0]*(n1)for_inrange(m1)]foriinrange(1,m1):forjinrange(1,n1):ifs1[i-1]s2[j-1]:dp[i][j]dp[i-1][j-1]1else:dp[i][j]max(dp[i-1][j],dp[i][j-1])returndp[m][n]记忆化递归deflcs_memo(s1,s2):lru_cache(maxsizeNone)defdfs(i,j):ifi0orj0:return0ifs1[i]s2[j]:returndfs(i-1,j-1)1returnmax(dfs(i-1,j),dfs(i,j-1))returndfs(len(s1)-1,len(s2)-1)空间优化两行滚动 O(n)只依赖上一行留两行用i%2交替。第 0 列留 0 当空 s2边界j从 1 起。答案在最后一行im-1写入dp[(m-1)%2]的第 n 列。deflcs_opt(s1,s2):ifnots1ornots2:return0nlen(s2)dp[[0]*(n1)for_inrange(2)]foriinrange(len(s1)):forjinrange(1,n1):ifs1[i]s2[j-1]:dp[i%2][j]dp[(i-1)%2][j-1]1else:dp[i%2][j]max(dp[i%2][j-1],dp[(i-1)%2][j])returndp[(len(s1)-1)%2][n]三、编辑距离二维 · 进阶题目把word1变成word2每次可插入 / 删除 / 替换一个字符求最少操作数。word1 horse,word2 ros→ 答案3。思路盯住末尾word1[i-1]与word2[j-1]相等不用动dp[i][j] dp[i-1][j-1]不等三种操作各对应一个更小子问题取最小删除word1[i-1]dp[i-1][j] 1i 退 1插入 消掉word2[j-1]dp[i][j-1] 1j 退 1替换dp[i-1][j-1] 1i、j 各退 1步答案状态dp[i][j]word1前 i 个变成word2前 j 个的最少操作数转移相等dp[i-1][j-1]不等1 min(删 dp[i-1][j], 插 dp[i][j-1], 改 dp[i-1][j-1])边界dp[i][0] i删 i 个、dp[0][j] j增 j 个记忆要点看下标往哪退——只 i 退→删只 j 退→插都退→改。在表里就是上删、左插、左上改。填表horse / ros r o s 0 1 2 3 h 1 1 2 3 o 2 2 1 2 r 3 2 2 2 s 4 3 3 2 e 5 4 4 3 ← 答案dp 递推defedit_dp(word1,word2):n,mlen(word1),len(word2)dp[[0]*(m1)for_inrange(n1)]foriinrange(n1):dp[i][0]i# 删 i 个forjinrange(m1):dp[0][j]j# 增 j 个foriinrange(1,n1):forjinrange(1,m1):ifword1[i-1]word2[j-1]:dp[i][j]dp[i-1][j-1]else:dp[i][j]1min(dp[i-1][j],# 删dp[i][j-1],# 插dp[i-1][j-1])# 改returndp[n][m]记忆化递归defedit_memo(word1,word2):lru_cache(maxsizeNone)defdfs(i,j):ifi0:returnj# 插 j 个ifj0:returni# 删 i 个ifword1[i-1]word2[j-1]:returndfs(i-1,j-1)return1min(dfs(i-1,j),# 删dfs(i,j-1),# 插dfs(i-1,j-1))# 改returndfs(len(word1),len(word2))空间优化两行滚动 O(n)两个要点都是踩坑高发区defedit_opt(word1,word2):n,mlen(word1),len(word2)dp[[0]*(m1)for_inrange(2)]forjinrange(m1):dp[0][j]jforiinrange(1,n1):dp[i%2][0]i# ★每行开头必须更新第 0 列forjinrange(1,m1):ifword1[i-1]word2[j-1]:dp[i%2][j]dp[(i-1)%2][j-1]else:dp[i%2][j]1min(dp[(i-1)%2][j],# 删dp[i%2][j-1],# 插dp[(i-1)%2][j-1])# 改returndp[n%2][m]# ★取最终行第 m 列不是 min(整行)总结对照题维度状态转移核心求时间空间(优化)打家劫舍一维dp[i]前i房最大金额max(dp[i-1], dp[i-2]nums[i])最大O(n)O(1)LCS二维dp[i][j]两前缀的 LCS 长相等1不等max(上,左)最大O(mn)O(n)编辑距离二维dp[i][j]i→j 最少操作相等0不等1min(上,左,左上)最小O(mn)O(n)递进规律一维→二维max→min“选/不选两路→三种操作三路”。把每题的最后一步想清楚三种实现就是同一套思路的三种写法。系列学习见附件

相关新闻

Jmeter-SMTP Sampler 发送运行结果到指定邮箱

Jmeter-SMTP Sampler 发送运行结果到指定邮箱

2026/8/27 8:37:38

参考链接: SMTP Sampler: Jmeter——SMTP Sampler发送邮件 - 温一壶清酒 - 博客园 SMTP Sampler 参数配置: Jenkins环境搭建(3)-配置自动发送邮件 - 温一壶清酒 - 博客园

从高分毕设到工业级应用:深度学习车牌识别系统核心技术解析

从高分毕设到工业级应用:深度学习车牌识别系统核心技术解析

2026/8/27 8:27:38

简介:计算机视觉作为人工智能的核心分支,旨在使机器能够理解和解释视觉世界。其基本原理是通过算法模型从图像或视频中提取、处理和分析信息。在众多应用场景中,目标检测与识别技术是实现自动化感知的关键,广泛应用于安防、交通、…

AI 双筒望远镜技术拆解:从边缘计算到目标识别原型实战

AI 双筒望远镜技术拆解:从边缘计算到目标识别原型实战

2026/8/27 8:27:38

最近两年,双筒望远镜这个看起来非常传统的行业,正在被 AI 悄悄改写。以前我们拿起望远镜,看到什么全凭肉眼和光学素质;现在拿起一台智能望远镜,画面里会直接出现识别框、物种名称,甚至还能帮你把远处的目标…

python零基础入门学习推荐

python零基础入门学习推荐

2026/8/27 9:47:42

零基础开展学习, 这是完全能够行得通的, 其关键之处在于要掌握正确的学习方法以及选择恰当的资源。好课优选为你整理出了一份从零基础起始的学习指南, 该指南主要划分成学习路径与优质资源推荐这两个部分。零基础学习路径建议向刚开始学习的人而言, 别在初始阶段就去追寻那种涵…

无需改造现有产线,合米科技 AI SOP 视觉防错系统,快速落地拉高产线良率。

无需改造现有产线,合米科技 AI SOP 视觉防错系统,快速落地拉高产线良率。

2026/8/27 9:47:42

摘要传统产线 SOP 执行难,人工管控易产生质量隐患。深圳合米科技 AI SOP 视觉防错系统,仅加装摄像头调试即可部署,无需大规模改造产线。AI 实时校验作业动作,异常即时告警,留存追溯数据,提升产线良率&#…

具身智能开放策略之Octo详解:开放策略如何把多机器人经验变成可微调的通用底座

具身智能开放策略之Octo详解:开放策略如何把多机器人经验变成可微调的通用底座

2026/8/27 9:47:42

写在前面 【从零走向AGI】旨在深入了解通用人工智能(AGI)的发展路径,从最基础的概念起,逐步构建完整的知识体系。 项目地址🔗:https://github.com/AI-mzq/From-Zero-to-AGI.git 魔方AI空间 猫先生 从零走向…

Python SQLAlchemy 与数据库操作讲解

Python SQLAlchemy 与数据库操作讲解

2026/8/27 9:47:42

文章目录一、核心概念二、安装三、快速开始(SQLAlchemy 2.0 风格)1. 创建引擎与基类2. 定义模型3. 创建表四、最常用的 CRUD 操作1. 增加(Create)2. 查询(Read)3. 更新(Update)4. 删…

Java大厂面试实录:Spring Boot + Kafka + Redis + Spring Security + RAG 的三轮攻防

Java大厂面试实录:Spring Boot + Kafka + Redis + Spring Security + RAG 的三轮攻防

2026/8/27 9:47:41

Java大厂面试实录:Spring Boot Kafka Redis Spring Security RAG 的三轮攻防场景:某互联网大厂 Java 岗位面试现场。面试官表情严肃,候选人燕双非一脸轻松,主打一个“我可能不全会,但我会努力胡说八道”。第一轮&a…

跨境ETF套利策略设计:从理论价差到实战风控

跨境ETF套利策略设计:从理论价差到实战风控

2026/8/27 9:37:41

1. 从一道赛题到实战:跨境ETF套利策略的深度拆解 最近翻看去年的一些数学建模竞赛题目,发现“2023大湾区杯”的A题“跨境ETF套利策略设计”很有意思。这道题没有像很多传统题目那样给出海量的历史数据让你去拟合,而是直接抛出了一个非常贴近真…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/27 7:25:23

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…