【BZOJ1076】【SCOI2008】奖励关(DP、期望、状压)
2018-02-04 13:27
399 查看
Description
click meSolution
套路的状压期望DP题。。。考虑倒退期望:设fi,jfi,j为一直到第i−1i−1轮、当前状态为jj的最大分数。
转移
若当前状态满足第kk个宝物的前提条件,那么选择取或不取。若不满足,那么不取。
具体转移方程参看代码。
Source
/********************************** * Au: Hany01 * Prob: BZOJ1076 & SCOI2008 奖励关 * Date: Feb 4th, 2018 * Email: hany01@foxmail.com **********************************/ #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<set> using namespace std; typedef long long LL; #define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i) #define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i) #define rep(i, k) for (register int i = 0, i##_end_ = (k); i < i##_end_; ++ i) #define Set(a, b) memset(a, b, sizeof(a)) #define Cpy(a, b) memcpy(a, b, sizeof(a)) #define fir first #define sec second #define pb(a) push_back(a) #define mp(a, b) make_pair(a, b) #define ALL(a) (a).begin(), (a).end() #define SZ(a) ((int)(a).size()) #define INF (0x3f3f3f3f) #define INF1 (2139062143) #define Mod (1000000007) #define debug(...) fprintf(stderr, __VA_ARGS__) template <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; } template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; } inline int read() { register int _ = 0, __ = 1; register char c_ = getchar(); for ( ; c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1; for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48); return _ * __; } inline void File() { #ifdef hany01 freopen("bzoj1076.in", "r", stdin); freopen("bzoj1076.out", "w", stdout); #endif } const int maxn = 16, maxk = 101; int K, n, p[maxn], pre[maxn], all, tmp; double f[maxk][1 << maxn]; int main() { File(); K = read(), n = read(); For(i, 1, n) { p[i] = read(); while (tmp = read()) pre[i] |= (1 << (tmp - 1)); } all = (1 << n); //f[i][j]: Before the i_th round, when the condition is j, maximize the scores. Fordown(i, K, 1) rep(st, all) { For(k, 1, n) if ((pre[k] & st) == pre[k]) f[i][st] += max(f[i + 1][st], f[i + 1][st | (1 << (k - 1))] + p[k]); else f[i][st] += f[i + 1][st]; f[i][st] /= n; } printf("%.6lf\n", f[1][0]); return 0; }
相关文章推荐
- BZOJ 1076: [SCOI2008]奖励关 [DP 期望 状压]
- BZOJ 1076 [SCOI2008]奖励关 状压+期望DP 题解
- bzoj1076 [SCOI2008]奖励关 状压+期望dp
- BZOJ 1076: [SCOI2008]奖励关 状压,期望DP
- BZOJ 1076 SCOI2008 奖励关 期望状压DP
- [BZOJ1076][SCOI2008]奖励关(状压DP)
- bzoj 1076: [SCOI2008]奖励关 (期望dp)
- BZOJ_1076_[SCOI2008]奖励关_状压DP
- 【BZOJ 1076】 [SCOI2008]奖励关 期望dp
- BZOJ 1076([SCOI2008]奖励关-期望dp-从后向前)
- bzoj 1076: [SCOI2008]奖励关 期望dp+状态压缩
- [BZOJ1076][SCOI2008]奖励关 状压dp
- 【bzoj1076】【SCOI2008】【奖励关】期望最优值dp
- [BZOJ 1076][SCOI2008]奖励关:状压DP
- bzoj1076: [SCOI2008]奖励关(期望dp+状压dp)
- 【BZOJ1076】【SCOI2008】奖励关&【BZOJ4318】OSU!()期望dp&【洛谷1850】换教室
- 【BZOJ1076】【SCOI2008】奖励关(期望+状压dp)
- 【bzoj1076】[SCOI2008]奖励关 期望dp+状态压缩dp
- BZOJ 1076: [SCOI2008]奖励关(期望+状压DP)
- [期望DP] BZOJ1076: [SCOI2008]奖励关