蓝书 dp 题板刷记录

蓝书 dp 题板刷记录

星号表示我认为有价值的题目。

*P3959 [NOIP 2017 提高组] 宝藏

首先,重边可以只保留边权最小的;其次,选的边一定构成一棵树,否则删去多余的边仍然保持连通。设 \(u\) 是 \(v\) 的父节点,则选边 \((u, v)\) 代价中的 \(K\) 对应 \(\operatorname{dep}(v)\)。考虑按深度分层 dp。

设 \(f(U, d)\) 表示只考虑点集 \(U\),且 \(U\) 中节点的最大深度为 \(d\) 时的最小代价。枚举 \(U\) 的子集 \(T\),钦定 \(T\) 中节点的深度为 \(d\)。设 \(S = U \setminus T\),我们要让 \(T\) 中的每个节点都向 \(S\) 中的节点连一条边。这里我们不必考虑 \(S\) 中的边是怎么连的,因此问题确实有最优子结构。那么,对于每个 \(u \in T\),我们要找到 \(v \in S\) 使得 \(w(u, v)\) 最小,这样选择边 \((u, v)\) 的代价就是 \(\operatorname{dep}(v) \times w(u, v)\)。

由于 \(\operatorname{dep}(v) = d\),所以可以把 \(d\) 提出来,这样点集 \(S\) 和 \(T\) 连边的代价就和外层循环无关,可以预处理,时间复杂度为 \(O(n^2 3^n)\)(\(O(3^n)\) 枚举子集,\(O(n^2)\) 枚举集合中的点)。记 \(g(T, S)\) 表示 \(T\) 向 \(S\) 连边的代价,则

\[f(U, d) = \min_{T \subset U, S = U \setminus T} \{f(S, d - 1) + d \cdot g(T, S)\} \]

这里有个问题:如何保证选择的边 \((u, v)\) 中,\(v\) 是深度为 \(d - 1\) 的点?我们已经钦定 \(u\) 的深度为 \(d\),如果 \(\operatorname{dep}(v) < d - 1\),就会导致 \(\operatorname{dep}(u) < d\),这样不就使得代价算大了吗?

实际上,我们可以证明:如果,对于某个特定的 \(T\) 和 \(S\),如果 \(T\) 中的点向 \(S\) 中深度小于 \(d - 1\) 的点连边,则 \(T = T'\) 一定不会被作为最优决策点。

用 \((u, v)\) 表示所有选择的边,设所有的 \(v\) 构成的集合为 \(S' \subseteq S\)。我们设计的 \(f(U, d)\) 这个状态并没有告诉我们究竟选了哪些边,使得代价最小的选边方式也可能不唯一。因此,我们说“\(T\) 中的点向 \(S\) 中深度小于 \(d - 1\) 的点连边”,实际上是在表达:所有使得子问题 \((S, d - 1)\) 代价最小的选边方式中,不存在一种方式,使得 \(S'\) 中的点深度均为 \(d - 1\)。

我们称选择的边 \((u, v)\) 是“劣边“,如果 $ \operatorname{dep}(v) < d - 1$。设所有”劣边“的边权之和为 \(W\),那么选择这些劣边的总代价为 \(d \cdot W\)。

(我自己做这道题时感性理解了这个结论,但是我尝试严谨证明时,发现自己无论如何都绕不开形式化语言的抽象怪圈。写了几十分钟的证明后,我感到有点头晕目眩了,所以暂时略过这段。)

(现在我通过询问 DeepSeek-V4.1-Flash 明白了怎么严格证明这个做法的正确性。但是这个证明比较形式化,我这里尽量说人话。)

我们定义子问题 \((U, d)\) 的真实答案 \(g(U, d)\) 为:对于某个点集 \(U\),只使用 \(U\) 中的边,并且生成的树高度不超过 \(d\) 时,最小的代价。事实上,我们有

\[f(U, d) \ge g(U, d) \]

并且大于号可能严格成立。也就是说,对于一个子问题,我们设计的 dp 不保证能求出正确答案。原因如上所述——计算过程中使用的深度可能偏大。但是,我们可以保证,

\[\min_{d < n} f(\{1, 2, \cdots n\}, d) \]

确实是原问题的答案。这里的直觉在于,设最优方案对应的树为 \(T^{\ast}\),dp 考虑到的所有决策,确实能构造出 \(T^{\ast}\)。

具体地,设 \(T^\ast\) 中深度为 \(t\) 的节点构成的集合为 \(T_t\),\(S_t = T_0 \cup T_1 \cup \cdots \cup T_t\)。计算 \(f(S_t, t)\) 时,由于 \(T_t \subset S_t\),所以取 \(T = T_t\) 确实是一个合法的决策点。因此,dp 考虑到了这种情况。设 \(T^{\ast}\) 的最大深度为 \(D\),对 \(|U|\) 和 \(d\) 进行归纳,就可以证明 \(f(\{1, 2, \cdots, n\}, D)\) 确实是子问题 \((\{1, 2, \cdots, n\}, D)\) 的真实答案。当然我们不知道 \(D\) 是多少,所以我们取遍所有的 \(1 < d < n\) 取 \(\min f(\{1, 2, \cdots n\}, d)\)。而转移时,非最优解计算的结果偏大,不影我们计算最小值。

初始化:\(f(\{u\}, 0) = 0\),其他状态设为 \(+\infty\)。

答案:\(\min_{0 \le d < n} f(\{1, 2, \cdots n\}, d)\)

时间复杂度:\(O(n^23^n) \sim O(n3^n)\)。

提交记录

PS:老师在高一时给我讲过这题,但当时怎么也理解不了。时隔三年,重新做这道题,居然看了几分钟就秒了(我一度以为我想简单了),看来我还是进步了。

P10975 Mondriaan's Dream / 蒙德里安的梦想

状压 dp,太简单了,不写题解。提交记录

P10974 Accumulation Degree

简单换根 dp。提交记录

P10973 Coins

多重背包板子。提交记录

P10972 I-Country

直观来看,“从任何一个正方形到另一个正方形只能沿着两个方向移动”就是说连通块是“凸的”,或者等价于如下表达:

设 \([l_i, r_i)\) 为第 \(i\) 行中选中的正方形区间,则

  1. \(l_i\) 单调减(阶段 0),单调增(阶段 1)或先减后增(阶段 0 ~ 阶段 1);
  2. \(r_i\) 单调增(阶段 0),单调减(阶段 1)或先增后减(阶段 0 ~ 阶段 1)。

(增减均为非严格的,即连续两行的 \(l_i\) 或 \(r_i\) 可以相同。)

容易设计出状态

\[f(i, l, r, c, 0/1, 0/1) \]

表示考虑了前 \(i\) 行,第 \((i - 1)\) 行选择了区间 \([l, r)\),总计选了 \(c\) 个正方形,且左/右轮廓分别在第 0/1 阶段时,占领石油资源的最大值。

转移时枚举上一行选择的正方形区间 \([L_i, R_i)\) 即可。比较繁琐的地方在于处理轮廓的转移,需要一些分类讨论。但是,总而言之,这道题的大致思路是很简单的。

视 \(n\),\(m\) 同阶,状态数 \(O(n^5)\),转移 \(O(n^2)\),时间复杂度 \(O(n^7)\)。有点卡常,我一开始在内层转移开了太多常数大小的 vector 来辅助计算,结果 T 了,改掉之后就过了。

提交记录

*P2893 [USACO08FEB] Making the Grade G

下面只讨论 \(B\) 不降的情况,不升的情况是对称的。

看到这题后,我立刻猜到,一定存在一个最优解 \(B^*\),使得 \(B^*\) 中的每一个元素都在 \(A\) 中出现过,这样就可以简单 dp 了。这个直觉来源于一个经典的问题:在一个数轴上有若干个房屋,找出一个地方建学校,使得所有房屋到学校的距离之和最小。答案是取房屋坐标的中位数,也就是说学校的最优坐标和某个房屋的坐标相同。本题显然和这个问题有类似之处,但我一直想不明白怎么证明。后来我询问 DeepSeek 得到了一个严谨的证明。

定理:存在一个最优解 \(B^*\),使得 \(B^*_i \in \{A_1, A_2, \cdots, A_n\}\)(\(1 \le i \le n\))。

证明:对任意满足条件的解 \(B\),将 \(B\) 中相同值的极大连续段称为一个“块”,其数量为 \(m\),第 \(i\) 块的范围为 \([l_i, r_i]\),块内元素的值为 \(c_i\)。则

\[c_1 < c_2 < \cdots < c_m \]

设 \(B\) 中有 \(t\) 个块的值没有在 \(A\) 中出现过,下面用反证法证明:一定存在一个最优解 \(B^*\),使得 \(t = 0\)。

假设不存在最优解使得 \(t = 0\)。设 \(B^*\) 为所有最优解中 \(m\) 最小的,且是 \(m\) 最小的最优解中 \(t\) 最小的(即 \((m, t)\) 字典序最小的),由假设得 \(t > 0\)。

对于一个块 \([l_k, r_k]\),定义其代价函数为

\[f_k(c) = \sum_{i = l_k}^{r_k} |A_i - c| \]

熟知当 \(c \in [\alpha, \beta]\) 时 \(f_k(c)\) 取到最小值,其中若 \([l_k, r_k]\) 长度为奇数,则 \(\alpha\) 和 \(\beta\) 均为 \(a_{l_k..r_k}\) 的中位数;否则 \(\alpha\) 和 \(\beta\) 分别为 \(a_{l_k..r_k}\) 排序后中间的两个数。

由于 \(t > 0\),所以存在一个块 \(k\),使得 \(c_k\) 没有在 \(A\) 中出现过。固定其他块不动,尝试调整 \(c_k\)。这里的约束是 \(c_k \in (c_{k - 1}, c_{k + 1})\)(设 \(c_0 = -\infty\),\(c_{n + 1} = +\infty\)),否则不满足 \(\{c_m\}\) 的单调性。

  1. 若 \(c_{k - 1} \le \alpha\),则把 \(c_k\) 调整到 \(\alpha\) 后,代价不变,且 \(m\) 和 \(t\) 均变小,矛盾;

  2. 若 \(\alpha \le c_{k - 1} \le \beta\),则把 \(c_k\) 调整到 \(c_{k - 1}\) 后,代价不变,且 \(m\) 变小,矛盾;

  3. 若 \(\beta < c_{k - 1} < c_k\),则 \(c_k\) 不在能使 \(f_{k}(c)\) 取到最小值的区间 \([\alpha, \beta]\) 内。那么,\(f_{k}(c)\) 在 \(c_k\) 附近这一段的邻域中,斜率大于 \(0\),因此令 \(c_k \gets c_k - 1\) 就会使代价变小,与最优性矛盾。

综上所述,取 \((m, t)\) 字典序最小的最优解,一定有 \(t = 0\),得证。

提交记录

PS:DS 告诉我这道题和保序回归有关。记录一些资料,也许以后会读。

posted @ 2026-10-17 22:21  DengStar  阅读(4)  评论(0)    收藏  举报