因为 m≤40m\le40m≤40 而想到 meet in the middle。
首先发现,合法条件即为 ∀i∈[2,n],ci−1c_i−1ci−1 和 cic_ici 中至少有一个被选择。
将颜色拆成前一半和后一半各 m/2m/2m/2 种。对于每一半,枚举每个颜色的选择与否,判断是否与合法条件矛盾。得到两个合法选择集合 S 与 T。
枚举 S 中每个方案,再枚举后一半中的颜色。可以根据前一半的选择与否,判断出该颜色此时是否必须被选择。
如果此时将后一半颜色的选择与否看成二进制位,那么此时可用的 T 集合的方案构成后缀 min 形式。只需要提前对 T 做预处理即可。
时间复杂度 O(n+2m/2∗m)O(n+2^{m/2}*m)O(n+2m/2∗m)。实现难度低。
6142

被折叠的 条评论
为什么被折叠?



