[BZOJ5006][LOJ#2290][THUWC2017]随机二分图(概率+状压DP)

https://loj.ac/problem/2290

题解:https://blog.csdn.net/Vectorxj/article/details/78905660

不是很好理解,对于边(x1,y1)和(x2,y2),可以分“x1或y1已匹配”,“x2或y2已匹配”,“x1,x2,y1,y2均未匹配”三种情况考虑拆边的正确性。

状压的时候,对于当前左边已经匹配的集合,只需要枚举左边已匹配的最后一个是用哪条边匹配的即可,也就是程序里的S<(1<<T)。

不要用顺推,记忆化搜索会忽略一些用不到的状态,所以会快一些。

 1 #include<map>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define rep(i,l,r) for (int i=l; i<=r; i++)
 5 using namespace std;
 6
 7 const int N=16,mod=1000000007,inv2=(mod+1)>>1,inv4=(mod+1)>>2;
 8 int n,m,cnt,t,x,y;
 9 struct E{ int S,p,c; E(int _S=0,int _p=0,int _c=0):S(_S),p(_p),c(_c){} }G[N*N<<2];
10 map<int,int>f[1<<N];
11
12 inline void add(int &x,int y){ x+=y; if (x>=mod) x-=mod; }
13 int F(int S){
14     if (!S) return 1;
15     int T0=S>>n,S0=S^(T0<<n);
16     if (f[S0].count(T0)) return f[S0][T0];
17     int res=0;
18     rep(i,1,cnt){
19         int T=G[i].S;
20         if ((T&S)==T && S<(T<<1)) add(res,1ll*F(S^T)*G[i].p%mod);
21     }
22     return f[S0][T0]=res;
23 }
24
25 int main(){
26     freopen("bzoj5006.in","r",stdin);
27     freopen("bzoj5006.out","w",stdout);
28     scanf("%d%d",&n,&m);
29     rep(i,1,m){
30         scanf("%d%d%d",&t,&x,&y);
31         int S1=(1<<(x-1))|(1<<(y+n-1)); G[++cnt]=E(S1,inv2,1);
32         if (t){
33             scanf("%d%d",&x,&y);
34             int S2=(1<<(x-1))|(1<<(y+n-1)); G[++cnt]=E(S2,inv2,1);
35             if (S1 & S2) continue;
36             G[++cnt]=E(S1|S2,((t==1)?inv4:mod-inv4),2);
37         }
38     }
39     printf("%lld\n",(1ll<<n)*F((1<<(n*2))-1)%mod);
40     return 0;
41 }

原文地址:https://www.cnblogs.com/HocRiser/p/8941925.html

时间: 2024-11-06 15:33:03

[BZOJ5006][LOJ#2290][THUWC2017]随机二分图(概率+状压DP)的相关文章

LOJ2540 [PKUWC2018] 随机算法 【状压DP】

题目分析: 听说这题考场上能被$ O(4^n) $的暴力水过,难不成出题人是毕姥爷? 首先思考一个显而易见的$ O(n^2*2^n) $的暴力DP.一般的DP都是考虑最近的加入了哪个点,然后删除后递归进行状压DP.由于这道题的题目询问方式是反过来的,处理方式也反过来. 令$ f[n][S] $表示当前有$ S $这些点,期望这些点能够构成独立集大小为$ n $.正向的考虑选择了哪个点,并把与这个点有连边的所有点在集合内进行删除,令找到的新状态为$ f[n-1][P] $.我们把$ P $中的结点

Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)

题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i](p+1 \leq x \leq n)<0\) 我们可以以\(p\)分成两个集合 \(n\leq 20\) 所以状压一下 \(sum[i]\)表示当前状态表示的和 \(f[i]\)表示用当前状态的数,组成最大前缀和为\(sum[i]\)的方案数 \(g[i]\)表示当前状态的数,组成的序列,每个前缀

(九度OJ)题目1338:角斗士(状压DP)

题目描述: 角斗士是古罗马奴隶社会的一种特殊身份的奴隶,他们的职责是在角斗场上进行殊死搏斗,为了人们提供野蛮的娱乐.他们的结局或是战死,或者由于表现突出赢得胜利而获得释放. 现在在角斗场里有N个待战的角斗士(1 <=N<=18),每天都将举行一场比赛,为了保持比赛的刺激性,每场比赛前才会在所有当前活着的角斗士之中随机选择两名进行上场拼杀.每场比赛的结束条件即为其中一名被杀死.当进行了N场比赛之后,最后存活的角斗士将被释放.而你将被赋予一个任务,计算出每名角斗士最终存活的概率.我们将提供角斗士之

【bzoj1076】【SCOI2008】【奖励关】【状压dp】

Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝物一共有n种,系统每次抛出这n种宝物的概率都相同且相互独立.也就是说,即使前k-1次系统都抛出宝物1(这种情况是有可能出现的,尽管概率非常小),第k次抛出各个宝物的概率依然均为1/n. 获取第i种宝物将得到Pi分,但并不是每种宝物都是可以随意获取的.第i种宝物有一个前提宝物集

BZOJ_1076_[SCOI2008]奖励关_状压DP

题意: 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝物一共有n种,系统每次抛出这n种宝物的概率都相同且相互独立.也就是说,即使前k-1次系统都抛出宝物1( 这种情况是有可能出现的,尽管概率非常小),第k次抛出各个宝物的概率依然均为1/n. 获取第i种宝物将得到Pi 分,但并不是每种宝物都是可以随意获取的.第i种宝物有一个前提宝物集合Si.只

CF482C Game with Strings (状压DP+期望DP)

题目大意:甲和乙玩游戏,甲给出n(n<=50)个等长的字符串(len<=20),然后甲选出其中一个字符串,乙随机询问该字符串某一位的字符(不会重复询问一个位置),求乙能确定该串是哪个字符串的询问次数的期望值 这题不看题解好难想......(感谢zhx和zhx两位大佬的题解) len很小,考虑状压DP,显然我们要状压询问,要定义两个状态,f[]和num[] 1表示询问,0表示未询问 那么,我们定义f[s]表示询问状态s距离确定一个字符串所需要的期望值. 定义tot是s状态剩余的询问的次数,那么显

HDU5816 Hearthstone(状压DP)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5816 Description Hearthstone is an online collectible card game from Blizzard Entertainment. Strategies and luck are the most important factors in this game. When you suffer a desperate situation an

HDU 4336 容斥原理 || 状压DP

状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示什么都不取得概率,p(x1)表示的是取x1的概率,最后要加一因为有又多拿了一次.整理一下就可以了. 1 #include <cstdio> 2 const int Maxn=23; 3 double F[1<<Maxn],p[Maxn]; 4 int n; 5 int main() 6

【BZOJ2064】分裂 状压DP

[BZOJ2064]分裂 Description 背景:和久必分,分久必和...题目描述:中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力.同时经常搞OI的他把这个变成了一个数学模型.假设中国的国土总和是不变的.每个国家都可以用他的国土面积代替,又两种可能,一种是两个国家合并为1个,那么新国家的面积为两者之和.一种是一个国家分裂为2个,那么2个新国家的面积之和为原国家的面积. WJMZBMR现在知道了很遥远的过去中国的状态,又知道了中国现在的状态,想知道至少要几次操作(