「PKUWC2018」随机算法
题目 思博状压写不出是不是没救了呀 首先我们直接状压当前最大独立集的大小显然是不对的,因为我们的答案还和我们考虑的顺序有关 我们发现最大独立集的个数好像不是很多,可能是 \(O(n)\) 级别的,于是我们考虑从这个方面入手 我们求出所有的最大独立集,考虑求出有多少种考虑顺序能够恰好得到这个最大独立集 设当前已经考虑的点的状态为 \(S\) 时的方案数为 \(dp_S\) 我们考虑枚举出一个不在状态 \(S\) 的点 \(x\) 分两种情况 \(x\) 是最大独立集的点,所以我们可以把这个点加入 \(S\) \(x\) 不是最大独立集的点,我们发现只有当和这个点相邻的且属于最大独立集的点加入 \(S\) ,我们才能加入 \(x\) ,这样 \(x\) 才能不被加入独立集 于是我们这样做就好啦,复杂度是 \(O(2^nn^2)\) ,卡卡常数就过去啦 代码 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define re register #define LL long long #define lb(x) ((x)&(-x)) #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) const