[BZOJ1076][SCOI2008]奖励关(状压dp+期望)

来源:互联网 发布:js createevent的用法 编辑:程序博客网 时间:2024/06/04 20:02

题目描述

传送门

题解

概率和期望什么都不会吖。。。感觉这题不是很难但是我还是看了题解才做出来。。。
这一步的期望=(上一步的期望+这一步的权值)*这一步的概率。
然后用一维状压来表示一下已选过的状态来判断是否可以满足。用f(i,s)来表示第i步状态为s的期望。由于正推没有办法确定状态的最优解,所以倒推比较合适。

代码

#include<iostream>#include<cstring>#include<cstdio>using namespace std;int k,n,x,need[105];double val[105],f[105][1<<15],ans;int main(){    scanf("%d%d",&k,&n);    for (int i=1;i<=n;++i)    {        scanf("%lf",&val[i]);        while (~scanf("%d",&x))        {            if (!x) break;            need[i]|=(1<<(x-1));        }    }    for (int i=k;i;--i)        for (int s=0;s<1<<n;++s)        {            for (int j=1;j<=n;++j)                if ((s&need[j])==need[j])                    f[i][s]+=max(f[i+1][s],f[i+1][s|(1<<(j-1))]+val[j]);                else f[i][s]+=f[i+1][s];            f[i][s]/=(n+0.0);        }    printf("%0.6lf\n",f[1][0]);}
0 0