高维前缀和(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)];
非常简洁,比较好懂。

浙公网安备 33010602011771号