P3959 [NOIP 2017 提高组] 宝藏 题解

注意到 \(n\) 最多为\(12\) 非常小。

考虑枚举通往地面的宝藏屋。然后对于每个宝藏屋状态。状态压缩dp。

我们固定根节点 \(r\)

\(dp[S]\) 代表已经连同的集合为 \(S\) 时的最小代价。但是我们发现,由于代价的计算公式 \(L*K\) 涉及赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的宝藏屋的数量,即接入节点的深度, 与目前已连接树的结构有关。仅使用连接集合无法描述。

我们尝试证明最终形成的树总是最小生成树。

存在反例:

image

从现在开始我就不会了

以下是从题解中学习的内容

我们尝试记录深度。

把每个点的深度都记录下来显然是不可能的。

我们考虑

dp状态只需要保证最优解存在于dp过程当中,且没有假的更优解。

也就是说,我们可以有时把代价算大,只要存在状态可以计算出最优的代价即可。

我们考虑记录目前状态树的最大深度。然后每次把最大深度当作 \(k\)

也就是说,会出现实际代价小于计算代价的情况。

那么最优解还可以被正确计算吗?

我们发现一个问题,诺每次只加入一个点,然后更新最大深度。诺最优状态存在两个点同一深度。则无法计算。

那么我们可以一次给所有相同深度的点全加进去。

然后就可以了。因为在状态转移的过程中,总存在一个状态转移的过程序列。每次加入新点,新点的接入点的深度等于当前状态记录的最大深度。

说白了,正确状态总可以从深度意义上,由只有根节点,一层(深度)一层(深度)搭起来。

复杂度 \(O(n^23^n)\) 可以通过。

posted @ 2026-08-06 21:36  txp2025  阅读(6)  评论(0)    收藏  举报