当前位置: 首页 > 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.gsyq.cn/news/50397.html

相关文章:

  • 第三章作业
  • 腹泻与脱水
  • 2025年烘焙乳化剂定做厂家权威推荐榜单:保健品原料/稳定剂/制酶剂源头厂家精选
  • 【git 学习】-b v5.4.1 --recursive是什么意思
  • 2025年玻璃防霉纸厂家权威推荐榜单:铝板衬纸/晶圆隔离纸/电池片隔离纸源头厂家精选
  • 2025年陶瓷密封环圆台平面磨床批发厂家权威推荐榜单:陶瓷密封筒磨削圆台平面磨床/纸管圆刀片圆台平面磨床/包装材料圆刀片圆台平面磨床源头厂家精选
  • 2025年二氧化碳气体膨胀爆破实力厂家权威推荐榜单:气体爆破原理/气体膨胀爆破/气体爆破源头厂家精选
  • 2025年智慧客房系统供应商权威推荐榜单:行业领军企业深度解析
  • load_balance函数代码详解
  • AI 应用开发新选择:JBoltAI 框架适配 Java 生态,无缝集成现有项目
  • 题解:P14508 猜数游戏 guess
  • Why blog today
  • 从架构到体验:友猫社区平台的全栈便捷的技术解析与作用体系详解
  • 2025辽宁网络推广品牌最新TOP5评测推荐:赋能品牌增长新引擎
  • 用户数据采集实验软件
  • 算法第三章作业
  • 2025辽宁自媒体宣传公司/服务商最新TOP5榜单推荐:引领数字营销新生态
  • 如何批量標記 bangumi 往季新番
  • 如何遷移 bangumi 賬號
  • 免费AI论文写作工具推荐TOP6:高效生成+低查重率必备神器
  • 2025辽宁视频号推广公司最新top5推荐:腾讯生态营销新势力
  • 详细介绍:机器学习高级-Chapter 04-概率论与贝叶斯分类
  • 【Java 详解】Mysql 索引从入门到精通 - 教程
  • 2025年知名的粉煤灰选粉机行业内口碑厂家排行榜
  • 2025年靠谱的工业耐磨陶瓷衬板厂家最新用户好评榜
  • 2025年评价高的青稞磨面机行业内口碑厂家排行榜
  • T693579 关卡设计
  • 2025年口碑好的沙漏包装亚克力管用户好评厂家排行
  • 2025年靠谱的h5网站建设响应式网站建设口碑榜
  • 2025年质量好的陕西消防设备厂家选购指南与推荐