尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

SOS dp(高维前缀dp)

SOS dp(高维前缀dp)
📅 发布时间:2026/6/17 20:10:33

SOS dp(高维前缀dp)

有个数组\(A\),求数组\(B\)

\(B[i]=\sum_{j|i=i} A[j]\)

数组\(A\)的下标从0到\(2^n\)

\(SOS dp\)可以在\(O(n2^n)\)算出来

代码

for (int i = 0; i < (1 << N); i++)B[i] = A[i];
for (int i = 0; i < N; i++)for (int j = (1 << N) - 1; j >= 0; j--)if (j & (1 << i))B[j] += B[j ^ (1 << i)];

也可以来求

\(B[i]=max\{A[j]\},i|j=i\)

for (int i = 0; i < (1 << N); i++)B[i] = A[i];
for (int i = 0; i < N; i++)for (int j = (1 << N) - 1; j >= 0; j--)if (j & (1 << i))B[j] = max(B[j], B[j ^ (1 << i)]);

或者

\(B[i]=\sum_{j|i=j} A[j]\)

for (int i = 0; i < (1 << N); i++)B[i] = A[i];
for (int i = 0; i < N; i++)for (int j = (1 << N) - 1; j >= 0; j--)if (!(j & (1 << i)))B[j] += B[j ^ (1 << i)];

例题我们需要更多的例题

Problem - F - Codeforces

求\(a[i]|(a[j]\&a[k]) 的最大值,i<j<k\)

容易得到\(a[i]|(a[j]\&a[k])=\bar{a[i]}\&a[j]\&a[k]+a[i]\)

让\(C[i]=i\)值出现得最早下标

那么我们可以算\(B[i]=\)该\(\{C[j]\},(i|j=j)\)集合里得最大值

\(D[i]=\)该\(\{C[j]\},(i|j=j)\)集合里得次大值

枚举\(a[i]\), 然后从高位枚举S(\((\bar{a[i]}\&a[j]\&a[k])|S=(\bar{a[i]}\&a[j]\&a[k])\)), 看D[S]是否大于i,如果大于\(ans=max(s+a[i],ans)\)

代码

const int mod = 998244353, N = 1e7 + 10, G = 3;
ll a[N];
ll B[N];
ll D[N];
void add(int x, int id)
{if (id > B[x]){D[x] = B[x];B[x] = id;}else if (id >= D[x]){D[x] = id;}
}
void solve()
{int n;cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];add(a[i], i); // 初始话 B数组D数组}ll nx = 22;for (int i = 0; i < nx; i++) // sos dpfor (int j = (1 << nx) - 1; j >= 0; j--)if (!(j & (1 << i))){add(j, B[j ^ (1 << i)]);add(j, D[j ^ (1 << i)]);}ll ans = 0;for (int i = 1; i <= n; i++){int c = (1 << nx) - 1 - a[i]; // 枚举非a[i]int s = 0;                    // S=非a[i]&a[j]&a[k];for (int j = nx - 1; j >= 0; j--){if (!((c >> j) & 1)) // 非a[i]的第j位如果是0则continue,continue;s += (1 << j);if (D[s] < i){s -= (1 << j);}ans = max(ans, a[i] + s);}}cout << ans << endl;
}

P5495 【模板】Dirichlet 前缀和 - 洛谷 (luogu.com.cn))

根据前面的代码可知道。

for (枚举所有集合i)B[i] = A[i];
for (枚举元素i)for (枚举集合j)if (如果集合j包含元素i)B[j] = max(B[j], B[集合j去除掉元素i]);

对于这个题我们可以把质数当作元素。

const int mod = 998244353, N = 2e7 + 10, G = 3;
int isVisit[N], prime[N], c = 0;
void EulerSevie(int n)
{for (int i = 2; i <= n; ++i) // 老规矩,遍历区间{if (isVisit[i] == false) // 如果这个数未被访问,则是素数prime[++c] = i;      // 将素数保存在素数数组里面,计数+1// 下面for循环及里面的语句才是这个算法的精髓,我们下面细讲for (int j = 1; j <= c && i * prime[j] <= n; ++j){isVisit[i * prime[j]] = true;if (i % prime[j] == 0)break;}}
}
#define uint unsigned int
uint seed;
inline uint getnext()
{seed ^= seed << 13;seed ^= seed >> 17;seed ^= seed << 5;return seed;
}
uint b[N];
void solve()
{ll n;cin >> n >> seed;EulerSevie(n);for (int i = 1; i <= n; i++){b[i] = getnext();}for (uint i = 1; i <= c; i++){for (uint j = 1; prime[i] * j <= n; j++){b[prime[i] * j] += b[j];}}uint ans = 0;for (int i = 1; i <= n; i++){ans = ans ^ b[i];}cout << ans << endl;
}

相关新闻

  • 微信消息模版推送
  • 抖音批量视频下载工具源码C#源码|自动提取DY视频的软件工具
  • AI 检测:精准攻克米饭盒质检难题,赋能食品生产

最新新闻

  • 2026 安徽哪所学校护理升学强?5大高升学率中职招生名单 - 小途xt
  • NXP DPAA硬件加速实战:报文头操作与CAAM加密引擎配置详解
  • 2026年论文写作AI工具怎么用?豆包等工具详细使用教程 - 掌桥科研-AI论文写作
  • 2026滁州家长注意!离南京这么近,孩子学建筑去这所公办中职,比在南京打工强 - 我叫小周
  • 50行Python实现人脸检测:OpenCV+Haar级联原理与实战
  • 2026重庆高端珠宝首饰回收排行 权威鉴定实测靠谱商家榜单 - 名奢变现站

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号