题目链接

loj2540

题解

有一个朴素三进制状压\(dp\),考虑当前点三种状态:没考虑过,被选入集合,被排除

就有了\(O(n3^{n})\)的转移

但这样不优,我们考虑优化状态

设\(f[i][S]\)表示独立集大小为\(i\),不可选集合为\(S\)【要么是已经在独立集中,要么已经被排除了】

那么剩余点都是可选的

就枚举剩余点\(u\),记\(u\)相邻的集合为\(S_u\),那么当\(u\)加入后,集合\(S_u\)的点都不能选,但是由于所有点都会加入排列之中,\(S_u\)中除了\(S\)中的点,剩余点的点会排列在\(u\)之后,那么有

\[f[i + 1][S \cup S_u \cup \{u\}] += A_{n - |S| - 1}^{|S_u| - |S_u \cap S|}f[i][S]
\]

复杂度\(O(n^{2}2^{n})\)

但是有很多没用的状态,所以可以过

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 22,maxm = (1 << 21),INF = 1000000000,P = 998244353;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int n,m,G[maxn],f[maxn][maxm],fac[maxn],fv[maxn];
inline int qpow(int a,int b){
int re = 1;
for (; b; b >>= 1,a = 1ll * a * a % P)
if (b & 1) re = 1ll * re * a % P;
return re;
}
inline int cal(int s){
int re = 0;
while (s) re += (s & 1),s >>= 1;
return re;
}
inline int A(int n,int m){
return 1ll * fac[n] * fv[n - m] % P;
}
int main(){
fac[0] = 1; for (int i = 1; i <= 20; i++) fac[i] = 1ll * fac[i - 1] * i % P;
fv[20] = qpow(fac[20],P - 2); fv[0] = 1;
for (int i = 19; i; i--) fv[i] = 1ll * fv[i + 1] * (i + 1) % P;
n = read(); m = read(); int u,v;
while (m--){
u = read(),v = read();
G[u] |= (1 << v - 1);
G[v] |= (1 << u - 1);
}
int maxv = (1 << n) - 1;
f[0][0] = 1;
for (int i = 0; i < n; i++){
for (int s = 0; s <= maxv; s++){
if (!f[i][s]) continue;
int tot = cal(s);
for (int u = 1; u <= n; u++)
if (!(s & (1 << u - 1))){
int siz = cal(G[u]) - cal(s & G[u]),e = s | G[u] | (1 << u - 1);
f[i + 1][e] = (f[i + 1][e] + 1ll * f[i][s] * A(n - tot - 1,siz) % P) % P;
}
}
}
for (int i = n; i; i--)
if (f[i][maxv]){
printf("%lld\n",1ll * f[i][maxv] * fv[n] % P);
break;
}
return 0;
}

loj2540 「PKUWC2018」随机算法 【状压dp】的更多相关文章

  1. LOJ2540. 「PKUWC2018」随机算法【概率期望DP+状压DP】

    LINK 思路 首先在加入几个点之后所有的点都只有三种状态 一个是在独立集中,一个是和独立集联通,还有一个是没有被访问过 然后前两个状态是可以压缩起来的 因为我们只需要记录下当前独立集大小和是否被访问 ...

  2. LOJ2540「PKUWC2018」随机算法

    又是一道被咕了很久的题 貌似从WC2019之前咕到了现在 我们用f[i][s]表示现在最大独立集的大小为i 不可选集合为s 然后转移O(n)枚举加进来的点就比较简单啦 这个的复杂度是O(2^n*n^2 ...

  3. 【LOJ2540】「PKUWC2018」随机算法

    题意 题面 给一个 \(n\) 个点 \(m\) 条边的无向图.考虑如下求独立集的随机算法:随机一个排列并按顺序加点.如果当前点能加入独立集就加入,否则不加入.求该算法能求出最大独立集的概率. \(n ...

  4. 【LOJ】 #2540. 「PKUWC2018」随机算法

    题解 感觉极其神奇的状压dp \(dp[i][S]\)表示答案为i,然后不可选的点集为S 我们每次往答案里加一个点,然后方案数是,设原来可以选的点数是y,新加入一个点后导致了除了新加的点之外x个点不能 ...

  5. 「PKUWC2018」随机算法

    题目 思博状压写不出是不是没救了呀 首先我们直接状压当前最大独立集的大小显然是不对的,因为我们的答案还和我们考虑的顺序有关 我们发现最大独立集的个数好像不是很多,可能是\(O(n)\)级别的,于是我们 ...

  6. LG3092 「USACO2013NOV」No Change 状压DP

    问题描述 https://www.luogu.org/problem/P3092 题解 观察到 \(k \le 16\) ,自然想到对 \(k\) 状压. 设 \(opt[i]\) 代表使用硬币状况为 ...

  7. LOJ2540 PKUWC2018 随机算法 状压DP

    传送门 两种$DP$: ①$f_{i,j}$表示前$i$次选择,最大独立集为$j$时达到最大独立集的方案总数,转移:$a.f_{i,j}+=f_{i+1,j+2^k}$(保证$k$加入后符合条件):$ ...

  8. loj#2540. 「PKUWC2018」随机算法

    传送门 完了pkuwc咋全是dp怕是要爆零了-- 设\(f(S)\)表示\(S\)的排列数,\(S\)为不能再选的点集(也就是选到独立集里的点和与他们相邻的点),\(mx(S)\)表示\(S\)状态下 ...

  9. LG1879 「USACO2006NOV」Corn Fields 状压DP

    问题描述 LG1879 题解 设\(opt[i][j]\)代表前\(i\)行,且第\(i\)行状态为\(j\)的方案数. 枚举\(j\),再枚举\(k\),\(k\)为上一行的状态. 判断\(j,k\ ...

随机推荐

  1. 快速获取APP对应的appPackage和appActivity

    appPackage和appActivity 进行appium自动化测试非常重要的两个参数,我们所测试的APP不同,这两个参数肯定也是不一样的. 介绍两种方法可快速获取APP的这两个参数: 方法一 1 ...

  2. Flink架构分析之RPC详解

    主要抽象 Flink RPC 框架主要抽象了RpcService,RpcEndpoint,RpcGateway,RpcServer这几个接口,具体实现可以采用多种方式,比如:akka,netty Rp ...

  3. Windows Server平台 confluence6.7.1安装与破解

    1.1硬件需求建议: CPU:32/64 bit 2.27GHz双核心以上之CPU: 内存:8GB以上: 硬盘:300GB,7200转以上: 建议数据库.Confluence等各自独立一台服务器. 1 ...

  4. 高可用OpenStack(Queen版)集群-4.keystone集群

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  5. 2019CSUST集训队选拔赛题解(二)

    凛冬将至 Description 维斯特洛大陆的原住民是森林之子,他们长得如孩童一般,善于使用石器,威力值35,用树叶树枝作为衣物,在森林里繁衍生息,与万物和平相处.他们会使用古老的魔法(比如绿之视野 ...

  6. 学习笔记 | treap | splay

    目录 前言 treap 它的基本操作 前言 不会数据结构选手深深地感受到了来自treap的恶意QwQ 在听的时候感觉自己听得听懂的??大概只是听懂了它的意思 代码是怎么写都感觉写不好╮(╯﹏╰)╭ 菜 ...

  7. Yii2 输出图片相关

    http://www.yiichina.com/doc/api/2.0/yii-web-response#$format-detail https://segmentfault.com/q/10100 ...

  8. Python20-Day07

    面向对象之继承与派生 什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或者多个父类,父类又称为基类或者超类,新建的类称为派生类或者子类 子类会‘遗传’父类的特性,从而解决代码重用问题 py ...

  9. 【我的python之路】

    目录 我的python之路[第一章]字符编码集,数据类型 我的python之路[第二章]循环-内置方法-数据类型 我的python之路[第三章]函数 我的python之路[第四章]装饰器.生成器.迭代 ...

  10. Week2:阅读笔记与思考

    <构建之法>这本书的内容通俗易懂,每一个知识点都有许多事例佐证,阅读起来不像其他教科书那样枯燥无聊.但阅读过第一.二.十六章之后还是产生了几个疑问,以及更深层次的思考. 第一章 问题1: ...