BZOJ 1076: [SCOI2008]奖励关(期望+状压DP)
2018-03-15 14:46
459 查看
传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=1076题解
不能从前往后推,求期望的正确姿势应该是从后往前。每个物品有先决限制,我们将已获得的物品状压起来。记f[i][s]为第i关开始前拥有集合s的得分期望。
枚举关卡数、集合和第i关的物品。若满足先决条件,则f[i][s] += max(f[i+1][s], f[i+1][s|(1<<(j-1))]+Val[j]) ,否则f[i][s] += f[i+1][s],最后乘上概率1/n。f[1][0]就是答案。
由于有点虚空间,开了滚动数组,别忘了清空。
代码
#include <cstdio> #include <cstdlib> #include <iostream> #include <cmath> #include <algorithm> #include <cstring> #define maxn 16 using namespace std; double dp[2][1<<maxn]; int S[maxn], Val[maxn]; int n, k; int main(){ scanf("%d%d", &k, &n); int x; for(int i = 1; i <= n; i++){ scanf("%d", &Val[i]); for(;;){ scanf("%d", &x); if(!x) break; S[i] |= (1 << (x-1)); } } x = 0; for(int i = k; i >= 1; i--){ x ^= 1; for(int s = 0; s < (1<<n); s++){ dp[x][s] = 0.0; for(int j = 1; j <= n; j++){ if((s & S[j]) != S[j]) dp[ dde9 x][s] += dp[x^1][s]; else dp[x][s] += max(dp[x^1][s], dp[x^1][s|(1<<(j-1))]+(double)Val[j]); } dp[x][s] /= n; } } printf("%.6lf\n", dp[x][0]); return 0; }
相关文章推荐
- 【BZOJ1076】【SCOI2008】奖励关(期望+状压dp)
- 【BZOJ1076】【SCOI2008】奖励关&【BZOJ4318】OSU!()期望dp&【洛谷1850】换教室
- BZOJ 1076 SCOI2008 奖励关 期望状压DP
- bzoj 1076: [SCOI2008]奖励关 (期望dp)
- 【BZOJ1076】【SCOI2008】奖励关(DP、期望、状压)
- bzoj 1076: [SCOI2008]奖励关 期望dp+状态压缩
- BZOJ 1076 [SCOI2008]奖励关 状压+期望DP 题解
- BZOJ 1076: [SCOI2008]奖励关 [DP 期望 状压]
- 【bzoj1076】[SCOI2008]奖励关 期望dp+状态压缩dp
- 【BZOJ 1076】 [SCOI2008]奖励关 期望dp
- BZOJ 1076([SCOI2008]奖励关-期望dp-从后向前)
- 【BZOJ1076】[SCOI2008]奖励关【期望DP】【状压DP】
- bzoj1076 [SCOI2008]奖励关 状压+期望dp
- 【bzoj1076】【SCOI2008】【奖励关】期望最优值dp
- BZOJ 1076: [SCOI2008]奖励关 状压,期望DP
- bzoj1076: [SCOI2008]奖励关(期望dp+状压dp)
- [期望DP] BZOJ1076: [SCOI2008]奖励关
- BZOJ 1076 [SCOI2008]奖励关 - 状压DP+数学期望
- 【BZOJ 1076】[SCOI2008]奖励关(期望)
- BZOJ.1076.[SCOI2008]奖励关(概率DP 倒推)