状压 dp 做题记录
-
可以发现
,那么考虑状压 -
因为状态和前 2 行都有关,那么考虑状压下每两行的状态
-
设
,表示当前 行,当前行状态为 ,上一行状态为 的方案数
-
可以发现
,考虑状压 -
还是考虑压缩下每一行的状态
P1879 [USACO06NOV]Corn Fields G
-
可以发现
,考虑状压 -
还是考虑压缩下每一行
P3052 [USACO12MAR]Cows in a Skyscraper G
-
可以发现
,考虑状压 -
设
表示选这些物品的最小分组 -
注意子集枚举的技巧
for(int S0=S;S0;S0=(S0-1)&S)
-
注意到
,还是考虑状压 -
设
表示走到这个状态的方案数 -
那么对于每个方案,枚举上一个出牌的那一张牌,注意厄运数字不能转移
-
注意到小猪
-
仍然是将小猪的状态压下来,枚举子集
-
如果子集和自己小猪的数量差是 0/1 ,那么可以直接转移
-
如果是多个小猪,那么就需要判断这些小猪能否用一个二次函数解决
-
时间复杂度就是
-
可以发现这个东西不好正着推,因为有一些限制,所以考虑反着推
-
设
为 轮前,得到的物品集合为 ,第 轮到第 轮得到的价值的期望 -
那么枚举这一轮会得到什么物品,每个物品得到的概率是相等的,所以转移就可以了
-
因为我们已经知道之前的状态了,所以这样转移是正确的
-
其实就是对于这个图,求一个最小代价的生成树
-
可以发现每次拓展的花费和所在的树高有关
-
设
表示当前已经选好了集合 ,树高为 的最小代价 -
我们可以枚举这个集合的子集,并且满足这个子集可以拓展得到这个集合,然后通过子集转移过来
-
具体的对于每一个新加入的点,求出到这个子集的最短距离和,然后乘上子集的树高,也就是
-
初始化就是每个点一开始做单独一个集合的代价就是 0
-
可以发现有值的
,一定是至少满足这个集合是一联通的,不至于不合法 -
但是对于这个树高不一定能达到,求出来的代价会偏大,但是其实这个是没有关系的
-
因为最终的答案一定可以通过一个最优的形式转移过去,也就是答案其实是一定可以转移到的
-
枚举每个集合的子集,复杂度是
-
一个朴素的 dp 式子:
表示吃完了当前的后,分别的质数集合 -
但是因为值太大了,质数是压不下的,考虑一个经典的
trick
,根号分治 -
对于
的质数,仍然状压,其他的质数单独考虑,每个数只会有一个大质数 -
那么我们预处理出一个数的质数集合和大质数
-
将所有的数按照大质数排序,这样做是为了将大质数相同的数放在一起考虑
-
对于一段连续的大质数相同的数,这一段数要么全部给 S1 ,要么全部给 S2 ,要么谁都不要
-
那么对于这一段可以单独用两个数组
转移,分别表示这一段都给了 -
那么在一段的开头,将
数组赋值在 ,然后用 v 转移,在一段结束后,再将 赋值回 数组
- 考虑对于每种灯的状态都状压下来,然后跑最短路
-
说一个最平凡的做法
-
对于每条边的相对排名的概率是相同的,那么最暴力的做法就是全排列出每条边的排列,然后直接 Kruskal 判断到第几条边整个图能联通,假设是第
条,那么这条边的期望时间是 -
那么我们可以转换成求每一种
的贡献,也就是恰好第 边使得图联通的概率 -
将这个概率前缀和一下,假设为
,那么恰好为第 条边使得图联通的概率就是 -
所以现在就是要求
条边使得图能联通的概率(注意没有恰好) -
而概率可以转换成求满足条件的方案数和方案总数,方案总数比较好表示,所以就是要求方案数
-
注意到这个
,那么考虑状压,设 表示 这个集合用 条边使得联通的方案数,设 表示 这个集合用 条边无法联通的方案数, 为 集合涉及的边数量 -
那么
,正反则难,考虑求 -
对于一个集合
的联通情况,我们考虑随便找一个集合内的点,然后枚举这个点所在的集合,这个集合用了的边的数量 -
-
求出来了, 就可以求了 -
那么
-
-
题目就是要求到达一个集合期望最长的步数
-
通过 Min-Max 转换成一个集合到一个点的最小期望步数
-
用树上高斯消元预处理出每个集合到
的最小期望步数 -
进一步的优化就是 FWT 卷一下
-
观察到这个
,考虑矩乘 -
那么首先要推式子,发现这个
很小,把这个东西状压一下 -
设
表示位置 是状态 的方案数 -
考虑怎么转移
-
这个状态一定要恰好有
个 1 -
对于每个合法的状态,考虑可以转移到哪些状态
-
对于一个新的位置,一定会有一个位置跳过去
-
如果当前状态的首位是 1 ,那么必须是这个 1 跳过去
-
否则的话,就选一个 1 跳过去
-
那么系数矩阵就可以预处理出来了
一些小 trick
-
对于数据范围小成指数级别的,那就可以考虑状压了
-
枚举每个集合的子集的复杂度是
,for(int S0=S;S0;S0=(S0-1)&S)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!