高维前缀和

高维前缀和

二维前缀和

一般的做法是容斥:

for (int i = 1; i <= n; ++ i)
    for (int j = 1; j <= n; ++ j)
        sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];

实际上也可以固定其他维度,依次在每一维上求前缀和,即:

for (int i = 1; i <= n; ++ i)
    for (int j = 1; j <= n; ++ j)
        a[i][j] += a[i - 1][j];
for (int i = 1; i <= n; ++ i)
    for (int j = 1; j <= n; ++ j)
        a[i][j] += a[i][j - 1];

三维前缀和

同上,有:

for (int i = 1; i <= n; ++ i)
    for (int j = 1; j <= n; ++ j)
        for (int k = 1; k <= n; ++ k) 
            a[i][j][k] += a[i - 1][j][k];
for (int i = 1; i <= n; ++ i)
    for (int j = 1; j <= n; ++ j)
        for (int k = 1; k <= n; ++ k)
            a[i][j][k] += a[i][j - 1][k];
for (int i = 1; i <= n; ++ i)
    for (int j = 1; j <= n; ++ j)
        for (int k = 1; k <= n; ++ k)
            a[i][j][k] += a[i][j][k - 1];

显然也可以拓展成 k 维。

SOSDP

要解决的是如下的问题:

对于所有的 i,(i[0,2n1]),求解 jiaj(或者类似于求子集某些信息)。

想法如下:

n 位的二进制理解为 n 维,每一维仅有两个值(0 / 1),上面说的子集其实也就是高维前缀和

故考虑枚举当前在哪一维上做前缀和,对应做即可,时间复杂度 O(n2n)

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)];
posted @   chzhc  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
levels of contents
点击右上角即可分享
微信分享提示