随记 – 二月二十四日 – 一个集合的子集的子集数之和

有集合SSS=n|S|=n,则有TS2T=k=0n2k(nk)=3n\sum\limits_{T \subseteq S}2^{|T|}=\sum\limits_{k=0}^{n}2^k\dbinom{n}{k}=3^n。因此,若我们枚举集合,枚举集合的子集的子集做状压DP时,可以得到正确的复杂度O(3n)\mathrm{O}(3^n)而非错误的O(2n×2n)=O(4n)\mathrm{O}(2^n\times 2^n)=\mathrm{O}(4^n)。参见AtCoder ABC 187 F – Close Group

可以这样证明:考虑某个子集的子集PTSP \subseteq T \subseteq S,则SS中的每个元素有三种状态:aPa\in PaP,aTa \notin P, a \in TaT,aSa \notin T, a \in S。显然这样可以唯一表示SSTT以及PP,对应了所有子集的拆分方案。故原式成立。

  • 2022年2月24日