[算法模板]SOS DP
[算法模板]SOS DP
正文
SOS-DP(\(\text{Sum over Subsets}\))是用来解决这样的问题的:

其实就是子集和DP。上面每个\(F[mask]\)里面包含了\(mask\)所有二进制子集的信息。这是一种\(n\log_2 n\)的DP方法。
我们定义一个DP状态\(S(mask,i)\)代表\(mask\)子集中只有最靠右的\(i\)位与其不同的状态。
具体是这样的:

图中描述了\(S(10110,4)\)这个状态和其所有儿子之间的关系。
形象一些解释就是每次我们求解一个状态时,我们只从他的所有子集里和他只差一位的状态转移过来。(众所周知,如果\(A\subseteq B,B\subseteq C\)那么\(A\subseteq\) C)。
放一段代码:
for(int i = 0; i<(1<<N); ++i)
F[i] = A[i];
for(int i = 0;i < N; ++i) for(int mask = 0; mask < (1<<N); ++mask){
if(mask & (1<<i))
F[mask] += F[mask^(1<<i)];
}
所以显然,复杂度\(N\space 2^N\)。如果令值域为\(M\),那么复杂度就是\(M\log_2M\)。
例题
参考资料
SOS Dynamic Programming [Tutorial]

[算法模板]SOS DP的更多相关文章
- 算法模板学习专栏之总览(会慢慢陆续更新ing)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- DFS 算法模板
dfs算法模板: 1.下一层是多节点的dfs遍历 def dfs(array or root, cur_layer, path, result): if cur_layer == len(array) ...
- 匈牙利 算法&模板
匈牙利 算法 一. 算法简介 匈牙利算法是由匈牙利数学家Edmonds于1965年提出.该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. 二分图的定义: 设G=(V,E)是一个 ...
- Tarjan 算法&模板
Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...
- hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...
- POJ 1273 Drainage Ditches(网络流dinic算法模板)
POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...
- poj 1274 The Perfect Stall【匈牙利算法模板题】
The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20874 Accepted: 942 ...
- 最短路径---dijkstra算法模板
dijkstra算法模板 http://acm.hdu.edu.cn/showproblem.php?pid=1874 #include<stdio.h> #include<stri ...
- POJ 1815 - Friendship - [拆点最大流求最小点割集][暴力枚举求升序割点] - [Dinic算法模板 - 邻接矩阵型]
妖怪题目,做到现在:2017/8/19 - 1:41…… 不过想想还是值得的,至少邻接矩阵型的Dinic算法模板get√ 题目链接:http://poj.org/problem?id=1815 Tim ...
随机推荐
- Java设计模式原型模式
原型模式: – 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式. – 就是java中的克隆技术,以某个对象为原型,复制出新的对象.显然,新的对象具备原型对象的特点 – 优势 ...
- 2019-11-29-WPF-测试触摸设备发送触摸按下和抬起不成对
原文:2019-11-29-WPF-测试触摸设备发送触摸按下和抬起不成对 title author date CreateTime categories WPF 测试触摸设备发送触摸按下和抬起不成对 ...
- 使用Docker之镜像的拉取、查询、删除
1:查看镜像列表 2:拉取镜像 通过命令可以从镜像仓库中拉取镜像,默认从Docker Hub 获取. 命令格式: docker image pull <repository>:< ...
- css1.0~3.0背景图使用多张折叠的概念与方法
需求:使用多张图片作为页面的背景图: 首先需要了解background的属性以及细节知识:https://www.cnblogs.com/chenglj/p/7372996.html backgrou ...
- Python3的map/reduce
Python内建了map()和reduce()函数. 原文在这里MapReduce: Simplified Data Processing on Large Clusters,map/reduce的概 ...
- flink 安装及wordcount
1.下载 http://mirror.bit.edu.cn/apache/flink/ 2.安装 确保已经安装java8以上 解压flink tar zxvf flink-1.8.0-bin-scal ...
- ORACLE百分比分析函数RATIO_TO_REPORT() OVER()
有时候不用的指标的绝对值不能比,但是转转为百分比的形式就容易看出波动了,是数据分析的好用的一个分析函数 20:00:24 SYS@orcl> conn scott/tiger; Connecte ...
- 是否注意过isEmpty 和 isBlank 区别?
isEmpty 和 isBlank 区别 org.apache.commons.lang.StringUtils 类提供了 String 的常用操作,最为常用的判空有如下两种 isEmpty(Stri ...
- Zabbix监控服务器磁盘I/O
一.场景说明: 需要使用Zabbix监控服务器上各个磁盘的I/O使用率,当zabbix自身带的item无法满足我们的时候,则需自定义item. 包括: 磁盘读的次数 磁盘读的毫秒数 磁盘写的次 ...
- 第一部分day2-for、while、数据类型(字符串、列表、元组)
数据类型 数据类型的初识 1.数字 整数 int (integer) 整型 (注:python3 不区分整型和长整型,统一称之为整型) 长整型 float(浮点型) complex(复数) 是由实数和 ...