您的位置:首页 > 其它

1076: [SCOI2008]奖励关 概率与期望 DP

2016-01-15 17:02 288 查看
我们先考虑dp。

n很小,并且状态之间有明显的依赖关系,显然可以二进制状压。但是为了保证当前状态是从一个合法的状态转移而来是不好判断的。我们可以倒推,从后向前转移,因为后面的状态合法与前面的状态是否合法是没有关系的。倒推也是规避不合法状态的一种有效手段。这样最后的结果就是f[1][0]。

我表示不知道期望是什么东西。。更不知道怎么算。。膜一发题解吧QAQ。

这一步的期望=(上一步的期望+这一步的得分)/K

#include<iostream>
#include<cstdio>
using namespace std;
double f[101][1<<15];
int n,K,v[25],d[25];
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
int main()
{
K=read(); n=read();
for (int i=1;i<=n;i++)
{
v[i]=read();
int s=read();
while (s) d[i]|=1<<(s-1),s=read();
}
for (int i=K;i;i--)
for (int j=0;j<(1<<n);j++)
{
for (int k=1;k<=n;k++)
if ((d[k]&j)==d[k])
f[i][j]+=max(f[i+1][j],f[i+1][j|(1<<(k-1))]+v[k]);
else f[i][j]+=f[i+1][j];
f[i][j]/=n;
}
printf("%.6lf",f[1][0]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: