从2D1D到1D1D
从区间 DP 到线性 DP
题目
你有 \(n\) 个区间,每个区间是 \(l,r,w\) 三个参数描述,表示左右端点和权值,如果区间有交(包括端点),那么就在有交的两个区间连边,形成一张无向图,有个参数 \(k\),你需要删去一些区间,使得每个联通块大小不超过 \(k\)。
\(n\leq 500\)
\(n\leq 2500\)
思考
首先这肯定不是一个图论问题,给一张图做这个问题是 \(NP\) 的,所以要利用好区间的性质。
先把区间离散化。
发现可以考虑一段区间 \([l,r]\),只考虑在区间内的区间,计算其答案,有两种方式,第一种是将区间继续划分成两个子区间,划分区间的过程,体现出了全局最优的思想,即我们假定了当前区间内的所有线段全部联通,这样不一定能在此处取到最优解,但一定可以在向下动态规划的过程中得到最优解,另一种是直接在当前区间选最大的 \(k\) 个保留。
划分区间的方式,就是选一个地方断开,删掉越过这个地方的所有区间,变成两个子问题。
有了这样的思路,我们很容易设计出一个 \(O(n^3)\) 的区间动态规划出来。
优化
\(O(n^3)\) 可以通过 \(n\leq 500\) 的数据点,但是无法通过 \(n\leq 2500\),所以需要优化为 \(O(n^2)\),其中预处理 \([l,r]\) 的复杂度是 \(O(n^2\log n)\) 的,但是常数较小能够接受。
于是可以考虑利用区间 \(dp\) 的一些常见优化手段,打个表,发现决策点并不单调,所以对于这类 \(2D1D\) 问题我们有点束手无策。但是感觉上记录区间有点浪费,于是考虑能不能线性的搞出来。发现如果设 \(dp[i]\) 表示考虑前 \(i\) 个的答案,从 \(j<i\) 转移,\([j,i]\) 采用直接减少到 \(k\) 的方式,也能得到和区间DP方式相同的转移考虑。
所以被优化成了 \(O(n^2)\)。越过每个点的区间总数,是可以动态维护的,均摊 \(O(1)\)。
从2D1D到1D1D
其实这类问题,是伪区间DP问题,比较它和真区间DP问题,比如《石子合并》,《优雅的闪电》的差异。它本质上是 1D1D 问题,石子合并很明显就是需要体现区间合并的顺序,所以必须采用区间DP。优雅的闪电的转移,无法被 1D1D 的转移考虑完全,所以仍然需要区间 DP。
关于一些 2D1D 的问题,可以仔细考察它的转移,能否被 1D1D 的形式描述,以便优化。