高维前缀和(SOSDP)

我们求二维前缀和有如下形式:

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

大概就是先考虑第一维再考虑第二维。

有的时候会运用到二进制里面的子集和,也就是 \(g(S)=\sum_{T\subseteq S}f(T)\)。用同样的思路一维一维考虑有

for(int j=0;j<1<<n;j++)g[j]=f[j];
for(int i=0;i<n;i++)for(int j=0;j<1<<n;j++)if(j&(1<<i))g[j]+=g[j^(1<<n)];

非常简洁,比较好懂。

posted @ 2025-09-25 11:56  all_for_god  阅读(216)  评论(0)    收藏  举报