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

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

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

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

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

通过打表发现 kkmax(1,n22)\max(1, \frac{n}{2}-2) 的时候最优。

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