一个比较正经的做法
查看原帖
一个比较正经的做法
229981
hzy1楼主2022/10/4 12:07

类似 meet in the middle\texttt{meet in the middle},第一遍 dfsdfs 先搜索前 kk 个点,对于搜索出来的一个集合 SS(∣S∣≤k|S|\le k),如果 SS 内部合法(不考虑后 n−kn-k 个点)那么 fS=∣S∣f_S=|S|,否则 fS=0f_S=0。

然后对 fSf_S 做一遍高维前缀 max⁡\max,之后 fSf_S 的含义就变为 SS 的子集中,内部不矛盾的集合大小的最大值。

第二遍 dfsdfs 搜索后 n−kn-k 个点,对于搜索出来的一个集合 SS,同时维护 TT。其中 TT 是满足 TT 与 SS 不矛盾的最大集合,不难发现只有 TT 的子集不与 SS 矛盾。则 SS 的贡献为 ∣S∣+fT|S|+f_T,答案就是所有贡献的最大值。

接下来分析时间复杂度,第一遍 dfsdfs 及高维前缀 max⁡\max 预处理的复杂度为 O(k⋅2k)O(k\cdot 2^k),第二遍 dfsdfs 的时间复杂度是 O(2n−k)O(2^{n-k}),因此总时间复杂度为 O(k⋅2k+2n−k)O(k\cdot 2^k+2^{n-k})。

通过打表发现 kk 取 max⁡(1,n2−2)\max(1, \frac{n}{2}-2) 的时候最优。

2022/10/4 12:07
加载中...