【动态规划】SOSdp

SOSdp是关于集合的特殊动态规划

  • 子集和dp:dp(st,i)dp: dp(st,i) 表示集合stst 的最后ii 位变化的所有子集的贡献

  • ii 位为00dp(st,i)=dp(st,i1)dp(st,i)=dp(st,i-1)

  • ii 位为11dp(st,i)=dp(st,i1)+dp(st(1<<i),i1)dp(st,i)=dp(st,i-1)+dp(st\wedge (1<<i),i-1)

  • 压缩掉一维,变成如下代码

1
2
3
4
for (int j = 0; j < n; j++)
for (int i = 0; i < 1 << n; i++)
if (i >> j & 1)
f[i] += f[i ^ (1 << j)]; // i在j-1层
  • 应用
    • 高维前缀和