浅析容斥和DP综合运用
浅析容斥和DP综合运用
前言
众所周知在数数题中有一种很重要的计数方法——容斥。但是容斥有一个很大的缺陷:枚举子集的复杂度过高。所以对于数据规模较大的情况会很乏力,那么我们就只能引入容斥DP。
复习一下容斥
什么情况下用容斥?容斥能干什么?
容斥的基本功能就是当你知道任意个指定集合的交集,你就能推出这些集合的并集。
形式化的来说,就是:
\[
\left|\bigcup_{i=1}^{n} A_{i}\right|=\sum_{i=1}^{n}\left|A_{i}\right|-\sum_{1 \leq i<j \leq n}\left|A_{i} \cap A_{j}\right|+\sum_{1 \leq i<j<k \leq n}\left|A_{i} \cap A_{j} \cap A_{k}\right|-\cdots+(-1)^{n-1}\left|A_{1} \cap \cdots \cap A_{n}\right|
\]
只使用容斥朴素算法
如果我们只会容斥,我们该怎么做?很显然根据上面的公式,我们需要枚举任意集合的组合方式,然后统计他们的答案,将他们加入答案。
比如说在【线上训练 5】乘方中,当我们枚举出子集,我们就很容易求出子集的大小。
而【线上训练3】数个数,当我们枚举出了子集,我们也能统计出子集的大小
我们通过以上两道题,总结出了这种容斥题的一个特点:都是求集合的并集,同时你可以通过一些方式求得集合的交集。
使用DP进行优化
我们思考一下就会发现,上面两道题的复杂度瓶颈都在于需要\(2^k\)的枚举出所有的子集再进行DP。那我们就可以考虑进行DP。因为对于一个子集,添加一个元素,就会导致他贡献的符号取反。
一般DP状态都是\(dp[i][j]\),其中\(i\)代表前\(i\)个集合中的元素。而\(j\)一般代表一个决定交集大小的值。而对于\(j\)值相同的所有状态(子集),在它们之后再添加一个元素,对答案增加的贡献都一样。
举个例子:
在【线上训练3】数个数中,如果往一个子集内加入新的元素,子集的大小就会增加\((字符集)^{(加入的区间位置-上一个区间位置)}\)。所以我们记录的\(j\)就是上一个区间的位置。
而在【线上训练 5】乘方中,如果往一个子集内加入新的元素,子集的大小就会变成\(lcm(j,N_i)\)。所以\(j\)记录的就是选择的子集的\(lcm\)。
对于前一道题而言,因为决定所选子集的大小是子集中元素的间隔距离。所以我们需要一边\(dp\)选择元素,一边把每一次往子集里添加元素增加的贡献累加进入最终答案。
而对于后一道题而言,因为决定所选子集的大小是子集中元素的\(lcm\),因为这是一个数,而且这个数和前面说的转移答案所需要的\(j\)是同一个数,所以我们可以只在\(dp\)数组里记录容斥系数的和,等到最后再来统计答案。

浅析容斥和DP综合运用的更多相关文章
- hdu-5794 A Simple Chess(容斥+lucas+dp)
题目链接: A Simple Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- HUST 1569(Burnside定理+容斥+数位dp+矩阵快速幂)
传送门:Gift 题意:由n(n<=1e9)个珍珠构成的项链,珍珠包含幸运数字(有且仅由4或7组成),取区间[L,R]内的数字,相邻的数字不能相同,且旋转得到的相同的数列为一种,为最终能构成多少 ...
- 【BZOJ-4455】小星星 容斥 + 树形DP
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 204 Solved: 137[Submit][Status] ...
- bzoj 3622 已经没有什么好害怕的了 类似容斥,dp
3622: 已经没有什么好害怕的了 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1213 Solved: 576[Submit][Status][ ...
- 洛谷P5206 [WC2019]数树 [容斥,DP,生成函数,NTT]
传送门 Orz神仙题,让我长了许多见识. 长式子警告 思路 y=1 由于y=1时会导致后面一些式子未定义,先抓出来. printf("%lld",opt==0?1:(opt==1? ...
- LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)
题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...
- HDU 4632 Palindrome subsequence & FJUT3681 回文子序列种类数(回文子序列个数/回文子序列种数 容斥 + 区间DP)题解
题意1:问你一个串有几个不连续子序列(相同字母不同位置视为两个) 题意2:问你一个串有几种不连续子序列(相同字母不同位置视为一个,空串视为一个子序列) 思路1:由容斥可知当两个边界字母相同时 dp[i ...
- [LOJ2542][PKUWC2018]随机游走(MinMax容斥+树形DP)
MinMax容斥将问题转化为求x到S中任意点的最小时间. 树形DP,直接求概率比较困难,考虑只求系数.最后由于x节点作为树根无父亲,所以求出的第二个系数就是答案. https://blog.csdn. ...
- uoj#422. 【集训队作业2018】小Z的礼物(MIn-Max容斥+插头dp)
题面 传送门 题解 好迷-- 很明显它让我们求的是\(Max(S)\),我们用\(Min-Max\)容斥,因为\(Min(S)\)是很好求的,只要用方案数除以总方案数算出概率,再求出倒数就是期望了 然 ...
随机推荐
- 用Maven整合SSM框架
前述 Maven 是专门用于构建和管理Java相关项目的工具,利用 Maven 的主要目的是统一维护 jar 包.关于 Maven 的安装在这篇里面就不说了. SSM(Spring+SpringMVC ...
- .NET Core工作流引擎(RoadFlow)多语言版发布
经过两个月的辛苦努力.NET Core工作流引擎(RoadFlow)多语言版发布了,在原来只有一种简体中文语言的基础上增加了繁体中文和英文两种语言,还可以通过扩展增加任意语言包.至此RoadFlow工 ...
- Oracle 查询练习
非常经典的一些日常醒脑练习内容!! 如有更高效的写法欢迎赐教! .已知Oracle的Scott用户中提供了三个测试数据库表,名称分别为dept,emp和salgrade.使用SQL语言完成以下操作 ) ...
- 用ASP.NET创建数据库
小白的第一次使用: 程序员写程序,就好比一个物品的慢慢诞生,我们今天的这个例子就可以想象成一个物品慢慢的在编译的过程中,让我们所看到 一.创建我们所测试的项目 1.创建一个简单的带有模型层(Model ...
- MySQL问题记录——定义timestamp类型的数据
MySQL问题记录——定义timestamp类型的数据 摘要:本文主要记录了在使用MySQL的过程中定义timestamp类型数据时遇到的问题以及解决方案. 问题重现 在Windows环境下安装MyS ...
- 链表逆序,java实现
package com.cskaoyan.linkedlist; //反转数组 public class LinkedListDemo2 { public static Node reverse(No ...
- flink KMeans算法实现
更正:之前发的有两个错误. 1.K均值聚类算法 百度解释:k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类 ...
- [Go] golang的MPG调度模型
MPG模式运行状态11)当前程序有三个M,如果三个M都在一个cpu运行,就是并发,如果在不同的cpu运行就是并行2)M1,M2,M3正在执行一个G,M1的协程队列有三个,M2的协程队列有三个,M3的协 ...
- failed to map segment from shared object: Permission denied(error while loading shared libraries: libz.so.1)
centos 6.3 服务器重启后,sshd 竟然连接不上了,防火墙也没有限制,重启sshd 服务报以下错误: 于是到/lib64 目录下找,库文件并没有少,仔细想后面的报错信息是权限被拒绝了,百度了 ...
- Rust中的哈希Map
严谨! fn main() { use std::collections::HashMap; let mut scores = HashMap::new(); scores.insert(String ...