高维前缀和
高维前缀和
二维前缀和
一般的做法是容斥:
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];
显然也可以拓展成 维。
SOSDP
要解决的是如下的问题:
对于所有的 ,求解 (或者类似于求子集某些信息)。
想法如下:
将 位的二进制理解为 维,每一维仅有两个值(0 / 1),上面说的子集其实也就是高维前缀和。
故考虑枚举当前在哪一维上做前缀和,对应做即可,时间复杂度 。
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)];
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧