经典 DP 问题与状态定义大全

news/2025/11/24 19:03:13/文章来源:https://www.cnblogs.com/lf109/p/19265373

下面给出动态规划(DP)中最经典的问题类型与对应的典型状态定义(State Definition)大全,按主题系统归纳,方便学习与复习。每类均附带问题特征、常用状态表示、典型转移


一、序列型 DP(Sequence DP)

1. 最长上升子序列(LIS)

状态定义:
( dp[i] ):以第 (i) 个元素结尾的 LIS 长度
转移:
若 (a[j] < a[i]),则
( dp[i] = \max(dp[i], dp[j] + 1) )


2. 最长公共子序列(LCS)

状态定义:
( dp[i][j] ):A 的前 (i) 个与 B 的前 (j) 个的 LCS 长度
转移:

  • 若相等:( dp[i][j] = dp[i-1][j-1] + 1 )
  • 否则:取最大

3. 最长公共子串

状态定义:
( dp[i][j] ):以 A[i] 与 B[j] 结尾的最长公共子串长度
转移:
相等 → 继承;否则为 0


4. 编辑距离 / Levenshtein Distance

状态定义:
( dp[i][j] ):将 A 的前 i 个变为 B 的前 j 个的最少操作数
转移:
插入 / 删除 / 替换三类操作取最小


5. 最大子段和 / 最大子数组和(Kadane)

状态定义:
( dp[i] ):以 i 结尾的最大子段和
转移:
( dp[i] = \max(dp[i-1] + a[i], a[i]) )


二、背包型 DP(Knapsack DP)

1. 0-1 背包

状态定义:
( dp[i][j] ):前 i 件物品、容量 j 的最大价值
或一维优化:( dp[j] )


2. 完全背包

状态定义:
同 0-1 背包
转移区别:
完全背包内层 j 正序遍历


3. 多重背包

状态定义:
同上,但对单件物品有限次
方法: 分组、二进制优化


4. 组合类:零钱兑换、划分等

状态定义:
( dp[x] ):金额 x 的方案数
转移:
对硬币 c:
( dp[x] += dp[x-c] )


三、区间 DP(Interval DP)

适用于“合并、分裂、括号、区间取值”等问题。

1. 石子合并

状态定义:
( dp[l][r] ):合并区间 [l, r] 的最小代价
转移:
在 k 上切分
( dp[l][r] = \min(dp[l][k] + dp[k+1][r] + sum(l,r)) )


2. 戳气球 / 区间分裂型

状态定义:
( dp[l][r] ):戳掉区间 (l, r) 的最大得分
转移:
枚举最后戳掉的气球 k


3. 最优二叉搜索树(Optimal BST)

状态定义:
( dp[l][r] ):构造 [l,r] 作为子树的最小期望代价


四、树形 DP(Tree DP)

1. 树的最大独立集

状态定义:
( dp[u][0/1] ):节点 u 不选/选 时子树能取得的最大值
转移:
若 u 被选,子节点不得选


2. 树的直径(DP 版本)

状态定义:
( dp[u] ):从 u 向下的最长链
转移:
取子树最大两个链之和更新答案


3. 树的重心、子树大小

状态定义:
( size[u] ):子树大小
( dp[u] ):某种全局量(如距离和)


五、状态压缩 DP(Bitmask DP)

1. 旅行商问题(TSP)

状态定义:
( dp[S][i] ):集合 S 中的点已访问,当前在 i 的最小路径
转移:
枚举下一个点


2. 分组匹配 / 最小权完美匹配(G-match)

状态定义:
( dp[mask] ):mask 表示哪些点已匹配


3. N 皇后计数(通常优化)

状态定义:
使用 bitmask 表示列 / 对角线


六、图 DP(DAG DP)

1. 有向无环图上的最长/最短路径

状态定义:
( dp[u] ):从起点到 u 的最优值
特征:
在拓扑序上转移


2. 计数路径

状态定义:
( dp[u] ):到 u 的方案数


七、数位 DP(Digit DP)

1. 统计区间内满足某条件的数字数量

状态定义:
( dp[pos][state][limit][leadingzero] )
典型状态包括:

  • pos:当前处理的位
  • state:题目特定状态(如前缀数位和、是否出现过某模式)
  • limit:是否受上界约束
  • leadingzero:前导零处理

八、概率 DP(Probability DP)

1. 期望步数、随机游走

状态定义:
( dp[i] ):到达目标的期望步数 / 成功概率


2. 期望分数 / 赌徒破产问题

状态定义:
多为
( dp[i] = ... )
满足线性方程组


九、矩阵 DP / 网格 DP

1. 最小路径和(Grid Path)

状态定义:
( dp[i][j] ):走到 (i,j) 的最小代价


2. 独立点数、放置棋子

状态定义:
常配合状态压缩:
( dp[row][mask] )


3. 最大正方形 / 最长连续 1

状态定义:
( dp[i][j] = ) 以 (i,j) 为右下角的最大正方形边长


十、博弈 DP(Game DP)

1. 区间取石子、双方最优

状态定义:
( dp[l][r] ):当前玩家在区间 [l,r] 能获得的最大收益差
(或定义为双方分别的最大收益)


2. Grundy 数 / SG 函数

状态定义:
( sg[x] = mex({sg[y]}) )


十一、集合划分 DP(Partition DP)

1. 划分数组为 K 段的最小代价

状态定义:
( dp[i][k] ):前 i 个元素分成 k 段的最小代价


十二、计数类 DP

1. 组合计数(分组、子序列、子集数)

典型定义:
( dp[n][k] ):使用前 n 个元素选 k 个的方案
( dp[mask] ):子集方案数


十三、字符串结构 DP(Pattern DP)

1. 正则匹配、通配符

状态定义:
( dp[i][j] ):s 前 i 与 p 前 j 是否匹配


2. 回文子序列 / 子串

状态定义:
( dp[l][r] ):区间是否是回文 / 最长回文长度 / 最少删除次数


十四、综合类:常见模板总结

常用状态类型可高度抽象为:

类别 常用状态
序列 dp[i], dp[i][j]
区间 dp[l][r]
背包 dp[j], dp[i][j]
dp[u], dp[u][0/1], dp[u][mask]
位压缩 dp[mask], dp[mask][i]
数位 dp[pos][state][limit][lz]
DAG dp[u]
网格 dp[i][j]
博弈 dp[l][r], sg[x]

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

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

相关文章

selenium: 滚动到页面底部

一,代码: from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import Byfrom sel…

DP问题如何确定dp数组的定义以及如何推导状态转移方程?

下面给出一套体系化、可复用、适用于所有 DP(尤其是复杂 DP)的问题解法框架。 内容分为两部分:如何确定 dp 数组的定义(状态定义) 如何推导状态转移方程(状态转移)① 如何确定 DP 数组的定义?(状态定义的三原…

玄机webshell查杀_2025/11/24

玄机webshell查杀_2025/11/24玄机webshell查杀 题目要求flag位置 黑客webshell /var/www/html/include/gz.php黑客工具 哥斯拉特征webshell:隐藏shell /var/www/html/include/Db/.Mysqli.php免杀马 /var/www/html/wap…

深入解析:STM32H743-ARM例程31-CAN

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

题解:P13296 [GCJ 2013 #2] Erdős–Szekeres

更差的阅读体验注意到,对于 \(j < i, A_j \ge A_i\),则有 \(X_j > X_i\)。因为如果 \(X_j < X_i, A_i \ge A_j + 1\),矛盾。 对于 \(j > i, B_j \ge B_i\),则有 \(X_j > X_i\)。因为如果 \(X_j <…

Java高效开发实战:10个让代码质量飙升的黄金法则

在Java开发的广袤领域中,写出高质量、高性能的代码是每一位开发者的不懈追求。从优化日志输出到合理运用并发处理,从优雅地处理异常到高效管理资源,每一个细节都可能成为提升代码质量的关键。接下来,让我们深入探索…

2025年11月江苏徐州隔热条工厂综合推荐指南:五大优质供应商深度解析

摘要 随着建筑节能要求的不断提高,隔热条作为节能门窗的核心部件,其市场需求在2025年11月呈现持续增长态势。本文基于行业调研数据和用户真实反馈,为您推荐五家综合实力突出的隔热条生产厂家,并提供详细的对比分析…

人工智能之数据分析 numpy:第九章 数组运算(二)

人工智能之数据分析 numpy:第九章 数组运算(二)人工智能之数据分析 numpy 第九章 数组运算(二)@目录人工智能之数据分析 numpy前言一、三角函数(Trigonometric Functions)示例:二、双曲函数(Hyperbolic Funct…

客户结算方式太多太杂?一套进销存系统帮你统一管理!

客户结算方式太多太杂?票款顺序又不固定? 做企业的人大概率都经历过两个让人头疼的问题: 第一,客户的结算方式越来越多,填错一次就要返工一次; 第二,票、款、对账顺序五花八门,系统还要求你“严格按顺序走”。…

11月24日

上午同一建模实验,数据结构课程 下午java训练

动态=静态(转化思想,类似扫描线)

动态<=>静态(转化思想,类似扫描线)逆序对2 将静态的问题变为动态的待修改的问题

RAG相关概念梳理

一、构成RAG的基本概念 Embeddings:用数学空间表达语义和文本间的关系 文本相似度: 表层:词汇重叠.深层:语义 语义相似度与距离:关注文本的深层含义与上下文,而非仅仅是词汇。 语义距离:越近,语义相似度越高;…

gtags

针对您的情况(AOSP 代码量巨大、离线环境、无 root 权限、需安装在用户目录),我强烈推荐使用 GNU GLOBAL (Gtags) 配合 Universal Ctags。 为什么选择 GNU GLOBAL (Gtags)?比 Ctags 强大:Ctags 只能跳到定义(Def…

欧姆定律是个啥?

2025/11/24常用的电学量物理量 符号 单位(简称/全称)电压 U V / 伏特电流 I A / 安培电阻 R Ω / 欧姆功率 P W / 瓦特 欧姆定律核心定律I = U / R U = I * R R = U / I电流 = 电压 / 电阻 电压 = 电流 * 电阻 电阻…

抖音投流健康领域领航者——苏州诊途赋能品牌全域增长 - langchain

在短视频营销的新时代,如何让品牌在抖音平台脱颖而出?苏州诊途健康科技有限公司,专注抖音投流领域,为您提供精准高效的流量解决方案。 公司总部位于苏州,并在杭州、重庆等核心城市设立分支机构,构建起覆盖全国的…

Windows后门排查_2025/11/24(持续更新)

Windows后门排查_2025/11/24(持续更新)Windows后门排查 dll劫持 dll劫持介绍 劫持原理: 为了性能需求,程序开发时会同时开发一些dll文件,不过并没有指明绝对路径;所以程序启动时就会寻找并加载这些dll文件,寻找…

2025年11月江苏徐州系统门窗隔热条、江苏门窗隔热条、国标隔热条、隔热条、定制隔热产品厂家综合推荐指南

摘要 随着建筑节能标准的提升和消费者对门窗性能要求的提高,系统门窗隔热条行业在2025年迎来了快速发展期。隔热条作为影响门窗隔热性能的关键部件,其质量直接关系到整个门窗系统的保温效果和使用寿命。本文基于市场…

188. 买卖股票的最佳时机 IV -- DP问题如何确定dp数组的含义以及状态转移方程?

188. 买卖股票的最佳时机 IV 如何推导状态转移方程? 当前层的每一个状态来自上一层的哪些状态? 若状态转移方程中出现复杂计算,改变dp数组的定义或增加dp数组的维度。 class Solution {public int maxProfit(int k,…

博客园真不错

BbS.23bbb1.InFo/AuSt/2025_1.tmL BbS.23bbb1.InFo/AuSt/2025_2.tmL BbS.23bbb1.InFo/AuSt/2025_3.tmL BbS.23bbb1.InFo/AuSt/2025_4.tmL BbS.23bbb1.InFo/AuSt/2025_5.tmL BbS.23bbb1.InFo/AuSt/2025_6.tmL BbS.23bbb…

程序人生必读:如何通过读书会提升工艺深度与广度

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …