BZOJ1076 状压+期望

来源:互联网 发布:棕榈油 知乎 编辑:程序博客网 时间:2024/05/17 23:55

又来一道期望 我又一次没看数据范围 怎么想都觉得不可做啊 结果n<=15(沃尼玛)
言归正传 这题有很多无效状态 所以我们考虑倒着做 这样就可以保证从有效状态转移到有效状态 f[i][p]表示第i轮取到p这个状态期望得分 转移见代码

#include<bits/stdc++.h>using namespace std;double f[101][65536];int N,K;int v[20],d[20],p[20];inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int main(){    for(int i=1;i<=16;i++)p[i]=1<<(i-1);    N=read(),K=read();     for(int i=1,t;i<=K;i++){        v[i]=read(),t=read();        while(t){            d[i]+=p[t];            t=read();        }    }    for(int i=N;i;i--)        for(int j=0;j<=p[K+1]-1;j++){            for(int k=1;k<=K;k++)                if((d[k]&j)==d[k])                   f[i][j]+=max(f[i+1][j],f[i+1][j|p[k]]+v[k]);                else f[i][j]+=f[i+1][j];            f[i][j]/=K;        }    printf("%.6lf",f[1][0]);}
原创粉丝点击