[BZOJ3925][[Zjoi2015]地震后的幻想乡][期望+状压DP]
2017-03-29 19:12
525 查看
[BZOJ3925][[Zjoi2015]地震后的幻想乡][期望+状压DP]
]http://blog.csdn.net/skywalkert/article/details/47792065]这位神犇写得很好啊QAQ
代码:
#include <bits/stdc++.h> const int N = 11, M = 50; typedef long long ll; inline void read(ll &x) { scanf("%lld", &x); } ll n, m, e[1 << N], f[1 << N][M], g[1 << N][M], sz[1 << N], cnt[1 << N], C[M][M]; double ans; inline void Pre(int m) { C[0][0] = 1; for (int i = 1; i <= m; i++) { C[i][0] = C[i][i] = 1; for (int j = 1; j < i; j++) C[i][j] = C[i - 1][j] + C[i - 1][j - 1]; } } int main(void) { //freopen("in.txt", "r", stdin); read(n), read(m); Pre(m); for (int i = 1; i <= m; i++) { ll u, v; read(u), read(v); u--; v--; e[u] |= 1 << v; e[v] |= 1 << u; } for (int s = 0; s < 1 << n; s++) { sz[s] = sz[s >> 1] + (s & 1); if (sz[s] == 1) { g[s][0] = 1; continue; } for (int i = 0; i < n; i++) if (s & (1 << i)) { cnt[s] += sz[e[i] & s]; } cnt[s] >>= 1; int p = s & -s; for (int t = (s - 1) & s; t; t = (t - 1) & s) if (t & p) { for (int i = 0; i <= cnt[t]; i++) for (int j = 0; j <= cnt[s ^ t]; j++) f[s][i + j] += g[t][i] * C[cnt[s ^ t]][j]; } for (int i = 0; i <= cnt[s]; i++) g[s][i] = C[cnt[s]][i] - f[s][i]; } for (int i = 0; i <= m; i++) ans += (double)f[(1 << n) - 1][i] / C[cnt[(1 << n) - 1]][i]; ans /= (m + 1); printf("%.6lf\n", ans); return 0; }
完。
By g1n0st
相关文章推荐
- BZOJ 3925 [Zjoi2015]地震后的幻想乡 ——期望DP
- [期望 状压DP 子集DP 多项式] BZOJ 3925 [Zjoi2015]地震后的幻想乡
- 【BZOJ 3925】[Zjoi2015]地震后的幻想乡 期望概率dp+状态压缩+图论知识+组合数学
- [BZOJ3925][ZJOI2015]地震后的幻想乡-概率与期望-动态规划
- BZOJ 3925 Zjoi2015 地震后的幻想乡 期望状压DP
- 【BZOJ 3925】【ZJOI 2015】[概率dp]地震后的幻想乡
- BZOJ 3925: [Zjoi2015]地震后的幻想乡
- 【BZOJ3925】地震后的幻想乡(期望概率DP,状压DP)
- BZOJ3295:[Zjoi2015]地震后的幻想乡(状压dp)
- bzoj 3925: [Zjoi2015]地震后的幻想乡
- bzoj 3925: [Zjoi2015]地震后的幻想乡
- BZOJ 3925 [Zjoi2015]地震后的幻想乡
- BZOJ 3925 ZJOI2015 地震后的幻想乡
- BZOJ 3925: [Zjoi2015]地震后的幻想乡(概率)
- bzoj3925 [Zjoi2015]地震后的幻想乡
- BZOJ 3925 [Zjoi2015]地震后的幻想乡
- Bzoj3925--Zjoi2015地震后的幻想乡
- bzoj 3925: [Zjoi2015]地震后的幻想乡
- 3925: [Zjoi2015]地震后的幻想乡
- 3925: [Zjoi2015]地震后的幻想乡