#19489. 子序列DP模板-总体介绍
子序列DP模板-总体介绍
(本题是章节说明,程序请提交cout<"ok"即可。
你好!我是你的OI金牌教练。这份【子序列模板材料】非常系统地梳理了 通用子序列DP(General Subsequence DP) 的核心逻辑。子序列问题是动态规划的基石,掌握了这一套“嵌套循环模板”,你就开启了通往中高级 DP 的大门。
下面我将这份材料总结为五个教学章节,并为你匹配了对应的 洛谷(Luogu) 经典例题,帮助你通过实战巩固。
📘 子序列 DP 课程章节知识点全清单
第一章:概念辨析——子数组 vs. 子序列
- 核心知识点:
- 子数组 (Subarray): 必须连续(Contiguous)。通常用滑动窗口或前缀和 解决。
- 子序列 (Subsequence): 不必连续,但相对顺序(Relative Order)不能乱。这是 DP 的典型战场。
- 性质: 子数组一定是子序列,但子序列不一定是子数组。
- 关键词读题: “子序列”、“不一定连续”、“保持原顺序”。
- 洛谷例题: P1115 最大子段和(对比练习:这是子数组问题)
第二章:状态设计的“生死命门”——以 结尾
- 核心知识点:
- 状态定义: 表示“以索引 处元素结尾的”最优解。
- 为什么必须“以 结尾”? 因为子序列不连续,如果你只定义“前 个元素的最优解”,当你处理 时,你不知道前面的子序列最后落在哪,无法判断 能否接上去。
- 结果提取: 最终答案往往不是 ,而是 。
- 启发式思考: 想象你在草稿纸上画一列火车,要把 这一节车厢接上去,你必须知道前一节车厢 是谁。
- 洛谷例题: B3637 最长上升子序列(最基础的 练习)
第三章: 通用嵌套循环模板
- 核心知识点:
- 外层循环 : 遍历每一个可能作为结尾的元素。
- 内层循环 : 扫描 之前的所有元素,寻找合格的“前驱”。
- 状态转移方程:
if (condition(j, i)) dp[i] = max(dp[i], dp[j] + update_value) - 复杂度: 时间 ,空间 。适用于 的数据范围。
- 图形引导:
nums: [10, 20, 10, 30] dp: [ 1, 2, 1, 3] ^ ^ ^ ^ i=0 i=1 i=2 i=3 当 i=3 时,j 会扫过 0, 1, 2。因为 nums[3] > nums[0,1,2], 所以 dp[3] = max(dp[0]+1, dp[1]+1, dp[2]+1) = 3 - 洛谷例题: P1091 [NOIP2004 提高组] 合唱队形(双向 LIS 应用)
第四章:模板变体——从长度到和、到摆动、到二维
- 核心知识点:
- 改变目标(Update): 求最长改为求最大和()。
- 改变条件(Condition): “上升”改为“整除”()。
- 扩展状态(Multi-state): 如“摆动序列”,需要 和 两个数组来记录历史。
- 预处理排序: 面对“信封嵌套”等二维问题,通过排序将其转化为一维 LIS。
- 洛谷例题:
- P4933 大师(等差子序列,条件变体)
- P1020 [NOIP1999 普及组] 导弹拦截(经典必做:包含 LIS 及其对偶问题)
第五章:进阶优化—— 与路径重构
- 核心知识点:
- 优化: 仅限标准 LIS。利用贪心思想维护一个有序数组
tails,结合二分查找(Patience Sorting)。 - 路径重构: 额外使用
parent[i]数组记录每个 是从哪个 转移过来的,最后从max_index回溯。
- 优化: 仅限标准 LIS。利用贪心思想维护一个有序数组
- 性能权衡: 是“多功能瑞士军刀”(灵活但慢), 是“专业手术刀”(快但仅限特定场景)。
- 洛谷例题: P1439 【模板】最长公共子序列(利用映射将 LCS 转化为 的 LIS) (注:P1439题目放在了“二维DP”章节里)
💡 教练的启发式教学笔记(请在草稿纸上跟我做)
1. 时间复杂度推导练习:
- 思考: 为什么 时 会 TLE?
- 算一算: 次运算。计算机 1 秒约执行 次,你需要 100 秒!
- 优化建议: 看到 ,立刻寻找单调性,考虑二分查找优化或数据结构(如树状数组/线段树)优化。
2. 关键词读题技巧:
- 看到“最长”、“子序列” 优先考虑 以 结尾。
- 看到“至少”、“最多” 考虑初始化的 base case(通常是 1 或 )。
- 看到“输出具体的序列” 必须准备
parent数组记录转移来源。
3. 空间复杂度优化思考:
- 大部分子序列问题 只依赖于前面的 ,虽然不能像背包问题那样简单的压维,但在处理两个字符串的子序列(如 LCS)时,可以使用滚位数组将 优化到 。
加油!先把 B3637 和 P1020 刷掉,你对这个模板的理解就会上一个台阶!