连续段DP如何成?

摘要:连续段 DP 总结 一、核心思想 连续段 DP 是一种按元素放置顺序进行 DP 的技巧,常用于处理“序列中元素形成若干连续段”的问题。其核心特点是: 脱离数组构造:先不考虑具体序列位置,只维护“连续段”的数量与状态。 状态设计:通常设 (
连续段 DP 总结 一、核心思想 连续段 DP 是一种按元素放置顺序进行 DP 的技巧,常用于处理“序列中元素形成若干连续段”的问题。其核心特点是: 脱离数组构造:先不考虑具体序列位置,只维护“连续段”的数量与状态。 状态设计:通常设 \(dp_{i,j}\) 表示已处理 \(i\) 个元素,形成 \(j\) 个连续段的方案数。 转移方式:通过“新建段”、“扩展段”、“合并段”三种基本操作完成状态转移。 二、通用转移方式 设当前状态为 \(dp_{i,j}\): 1. 新建一个段 在 \(j+1\) 个空隙中插入新段: \[dp_{i+1,j+1} \gets dp_{i,j} \times (j+1) \] 2. 扩展一个段 在 \(j\) 个段的左右端点中选择一个扩展: \[dp_{i+1,j} \gets dp_{i,j} \times (2 \times j) \] 3. 合并两个段 在 \(j-1\) 个空隙中合并相邻段,需根据题目条件决定合并方式(如间距为 \(2\) 或 \(3\)): \[dp_{i+k,j-1} \gets dp_{i,j} \times \text{(系数)} \] 三、例题 1:CF1515E Phoenix and Computers 问题简述 有 \(n\) 台电脑,初始全关。 每次可手动打开一台电脑。 若某台电脑左右都已打开,它会自动打开。 问所有电脑最终打开的手动操作顺序方案数。 思路分析 状态设计 设 \(dp_{i,j}\) 表示已进行 \(i\) 次打开(包括手动和自动),形成 \(j\) 个连续段的方案数。 连续段之间至少间隔 \(2\) 个未打开电脑(否则会自动合并)。 转移方式 1. 新建段:在 \(j+1\) 个空隙中插入新段: \[dp_{i+1,j+1} \gets dp_{i,j} \times (j+1) \] 2. 扩展段:在 \(2j\) 个端点位置扩展: \[dp_{i+1,j} \gets dp_{i,j} \times (2\times j) \] 3. 合并段(间距为 \(2\)): 中间恰好隔 \(2\) 个空位,手动开 \(1\) 个,另 \(1\) 个自动开: \[dp_{i+2,j-1} \gets dp_{i,j} \times (j-1) \times 2 \] 最终答案 \[\text{ans} = \sum_{j} dp_{n,j} \] 四、例题 2:P7967 [COCI2021/2022 #2] Magnet 问题简述 有 \(n\) 个磁铁,半径分别为 \(r_i\)。 有 \(l\) 个空位,每个空位放一个磁铁,相邻空位距离为 \(1\)。 若两个磁铁距离小于某个磁铁的半径,则会被吸引。 求所有磁铁互不吸引的方案数。 思路分析 关键观察 磁铁按半径从小到大排序后处理,保证当前处理的是“最大”的磁铁。 每个磁铁决定其与相邻磁铁的距离。 状态设计 设 \(dp_{i,j,k}\) 表示: 已处理前 \(i\) 个最小磁铁 形成 \(j\) 个连续段 这些段占用的总长度为 \(k\) 转移方式 1. 新建段: \[dp_{i,j,k} \gets dp_{i,j,k} + dp_{i-1,j-1,k-1} \times j \] 2. 扩展段(贴边): 新增长度 \(a_i\) 有 \(2j\) 个端点可贴 \[dp_{i,j,k} \gets dp_{i,j,k} + dp_{i-1,j,k - a_i} \times (2\times j) \] 3. 合并两段: 新增长度 \(2a_i - 1\) 有 \(j\) 个空隙可合并 \[dp_{i,j,k} \gets dp_{i,j,k} + dp_{i-1,j+1,k - 2\times a_i + 1} \times j \] 插板法分配剩余空位 最终 \(n\) 个磁铁形成 \(1\) 个大段(\(j=1\)),总长度为 \(k\)。
阅读全文