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

题目描述

传送门

题解

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

代码

#include
#include
#include
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<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]);
}

你可能感兴趣的:(题解,dp,概率期望)