如何优雅的处理特殊的子集 dp 问题

sosdp & 高维前缀和

gi=j&i>0fj(i2n1)

我们将 i,j 进行二进制拆分,拆成 n 个维度。

类似于:

ga1,a2,a3,a4,a5...an=akbkfb1,b2,b3,b4,b5...bn(ai,bi{0,1})

我们发现这个问题本质上就转化成了一个高维前缀和。

code :

int len = (1 << n) - 1;
rep(i, 0, n - 1) {
    rep(j, 0, len) {
        if(!(j & (1 << i))) f[j | (1 << i)] = (f[j | (1 << i)] + f[j]) % P;
    }
}

例题:
CF1679E Typical Party in Dorm

posted @   KafuChino  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示