BZOJ 1076: [SCOI2008]奖励关【状压DP】
1076: [SCOI2008]奖励关
【题目描述】
传送门
【题解】
这题状压DP,求期望,倒着求更方便,最后的答案就是。
代码如下
#include<cstdio>
#include<algorithm>
using namespace std;
int T,n,a[25],v[25],p[25];double f[105][1<<16];
int main(){
#ifndef ONLINE_JUDGE
freopen("prob.in","r",stdin);
freopen("prob.out","w",stdout);
#endif
scanf("%d%d",&T,&n);
for(int i=1;i<=n+1;i++) p[i]=1<<(i-1);
for(int i=1;i<=n;i++){
int x;scanf("%d%d",&v[i],&x);
for(;x;scanf("%d",&x)) a[i]|=p[x];
}
for(int t=T;t;t--){
for(int j=0;j<p[n+1];j++){
for(int i=1;i<=n;i++)
if((j&a[i])==a[i]) f[t][j]+=max(f[t+1][j],f[t+1][j|p[i]]+v[i]);
else f[t][j]+=f[t+1][j];
f[t][j]/=n;
}
}
printf("%.6lf\n",f[1][0]);
return 0;
}