当前位置: 首页 > news >正文

浅谈 SOS DP

SOS DP 是状压 DP 的一种,全称 Sum over Subsets Dynamic Programming,用来解决一些子集和转移的问题,是高维前缀和的一种体现。

引入

因为大家都是这样引入的,我就这样引入吧。

例题:

给定一个含有 \(n\) 个数的序列 \(a_{n}\),对于每个集合 \(S \subset \{a_n\}\),计算 \(f_{S} = \sum_{T \subset S} \sum_{i \in T} a_i\),即计算所有子集的所有总和。

朴素的做法:暴力枚举每一个初始状态是 \(O(2^n)\) 的,暴力枚举每一个子集状态,总复杂度 \(O(4^n)\)

for (int i = 0; i < (1 << n); i++) {for (int j = 0; j < i; j++) {f[i] += f[j];}
}

当然这样的暴力复杂度是在是天方夜谭,如果你学过状压,那么你一定会子集枚举,并且知道总复杂度是 \(O(3^n)\) 的。

具体证明一下:假如一个状态上的 \(1\) 一共有 \(k\) 位,那么这样的状态 \(\dbinom{n}{k}\) 种情况,总和为 \(\sum_{k=0}^n \dbinom{n}{k} 2^k = \sum_{k=0}^n \dbinom{n}{k} 1^{n-k}2^k\),二项式定理得到 \((1+2)^n = O(3^n)\) 复杂度。

for (int i = 0; i < (1 << n); i++) {for (int j = i; j; j = (j - 1) & i) {f[i] += f[j];}
}

不出所料,上述的算法还可以优化,当一个状态的二进制位上有 \(k\)\(0\) 时,它将在其他状态被访问 \(2^k-1\) 次。

通俗来讲:我们有 \(S^{\prime\prime} \subset S^{\prime} \subset S\),我们计算 \(S\) 时,不光要计算 \(S^{\prime}\),还要计算 \(S^{\prime\prime}\),但这不必要,包含 \(S^{\prime}\) 一定意味着包含 \(S^{\prime\prime}\)

所以我们可以使用 DP 状态进行优化,我们枚举每一位 \(k\) 注意一定是在最外层顺序枚举,接下来枚举每一种状态。

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

考虑转移为什么是对的:我们定义 \(f_i\) 表示所有的子集和,正在转移第 \(k\) 位时,我们发现当前转移的 \(f_i\) 表示前 \(k\) 位是 \(i\) 的子集的子集和。

\[f_i \leftarrow f_{i - 2^k} \]

因为 \(f_{i-2^k}\)\(f_i\) 之前转移。

我们如果任意拿一个二进制举例,比如转移 \(100101\),转移到了 \(100\ \textbf{1}\ 01\)(加粗的那一位), 有:

\[f_{100101} = \begin{cases} f_{000001} \\ f_{100001} \\ f_{000101} \\ f_{100101} \end{cases} \]

最开始 \(f_{100101}\) 里面只有 \(f_{100101}\),转移第 \(1\) 位时加入了 \(000101\)

因此现在有:

\[f_{100101} = \begin{cases} f_{000001} (无) \\ f_{100001} (无) \\ f_{000101} (有) \\ f_{100101} (有) \end{cases} \]

观察发现如果此时 \(f_{100101}\) 再加上一个 \(f_{100001}\) 即可。

因为转移了第一位后:

\[f_{000101} = \begin{cases} f_{100001} (无) \\ f_{000001} (无) \end{cases} \]

因此我们证明任何转移都可以像上述一样成立。

http://www.jsqmd.com/news/41082/

相关文章:

  • 第三章作业
  • 2025年青岛蓝光扫描仪全国销售公司权威推荐榜单:扫描仪全国销售/蓝光扫描仪全国售卖/三丰扫描仪全国售卖源头公司精选
  • 腹泻与脱水
  • 2025年特种电缆生产厂家权威推荐榜单:防火电缆/电线电缆/控制电缆源头厂家精选
  • 2025年烘焙乳化剂定做厂家权威推荐榜单:保健品原料/稳定剂/制酶剂源头厂家精选
  • 【git 学习】-b v5.4.1 --recursive是什么意思
  • 深入解析:【C++】stack|queue|deque
  • GPT-Sovits模型实现AI声音克隆
  • 2025年抑尘剂供货厂家权威推荐榜单:煤矿阻化剂/氯化镁/无水氯化镁源头厂家精选
  • RAG的工作原理
  • 2025年玻璃防霉纸厂家权威推荐榜单:铝板衬纸/晶圆隔离纸/电池片隔离纸源头厂家精选
  • 2025年陶瓷密封环圆台平面磨床批发厂家权威推荐榜单:陶瓷密封筒磨削圆台平面磨床/纸管圆刀片圆台平面磨床/包装材料圆刀片圆台平面磨床源头厂家精选
  • 2025年二氧化碳气体膨胀爆破实力厂家权威推荐榜单:气体爆破原理/气体膨胀爆破/气体爆破源头厂家精选
  • 现今智慧客房系统开发团队排名:2025年酒店智能化解决方案权威指南
  • 2025年智慧客房系统供应商权威推荐榜单:行业领军企业深度解析
  • 2025年安徽靠谱的自助入住系统服务权威推荐
  • 2025年合肥专业的自助入住系统服务商
  • P11267 【MX-S5-T1】王国边缘,我的痛你如何懂QWQ
  • 聚焦澳大利亚留学:2025热门机构核心优势对比,录取率/服务/费用一网打尽
  • 2025年克锐思变形缝渗漏维修定制厂家权威推荐榜单:克锐思施工缝渗漏维修/克锐思地下室堵漏/克锐思穿墙管渗漏维修服务商精选
  • 英语_阅读_tourist industry_待读
  • RAG RAG(Retrieval-Augmented Generation,检索增强生成)
  • load_balance函数代码详解
  • 2025年专业机构检测制造厂权威推荐榜单:学校实验仪器检验/实验室通用仪器检测/仪器检定检测服务机构精选
  • AI 应用开发新选择:JBoltAI 框架适配 Java 生态,无缝集成现有项目
  • 思考文明社会
  • 2025 年 11 月铝合金门窗厂家推荐排行榜,断桥门窗,断桥推拉门窗,系统门窗,金属门窗,阳台封阳台门窗,平开推拉折叠门窗公司推荐
  • 2025年国内有实力的矿用设备安全检测检验工厂综合评估与选择指南
  • 题解:P14508 猜数游戏 guess
  • 2025 年 11 月合肥搬家公司推荐排行榜,合肥正规搬家公司,合肥市搬家公司,合肥包河区搬家公司,合肥蜀山区搬家公司服务推荐