类似 meet in the middle,第一遍 dfs 先搜索前 k 个点,对于搜索出来的一个集合 S(∣S∣≤k),如果 S 内部合法(不考虑后 n−k 个点)那么 fS=∣S∣,否则 fS=0。
然后对 fS 做一遍高维前缀 max,之后 fS 的含义就变为 S 的子集中,内部不矛盾的集合大小的最大值。
第二遍 dfs 搜索后 n−k 个点,对于搜索出来的一个集合 S,同时维护 T。其中 T 是满足 T 与 S 不矛盾的最大集合,不难发现只有 T 的子集不与 S 矛盾。则 S 的贡献为 ∣S∣+fT,答案就是所有贡献的最大值。
接下来分析时间复杂度,第一遍 dfs 及高维前缀 max 预处理的复杂度为 O(k⋅2k),第二遍 dfs 的时间复杂度是 O(2n−k),因此总时间复杂度为 O(k⋅2k+2n−k)。
通过打表发现 k 取 max(1,2n−2) 的时候最优。