1076: [SCOI2008]獎勵關
阿新 • • 發佈:2017-11-18
獎勵 %d col 就是 ret main sco ios pre
這題有點坑。
很容易看出是狀壓吧。
但請謹記求概率用正推,期望用逆推。
然而這題為啥我一開始覺得逆推不行呢。
就是因為前置集合。
那麽為啥不影響呢。
其實我們逆推的時候也可以判斷這個時候可不可以繼承,不行就直接不變。
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int Bin[20]; void cs() { Bin[1]=1;for(int i=2;i<=15;i++)Bin[i]=Bin[i-1]*2; }int a[20],qt[20]; double f[110][41000]; int main() { cs(); int n,k,x; scanf("%d%d",&k,&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); while(scanf("%d",&x)!=EOF) { if(x==0)break; qt[i]+=Bin[x]; } }for(int i=k;i>=1;i--) for(int zt=0;zt<=Bin[n]*2-1;zt++) { for(int j=1;j<=n;j++) { if((qt[j]&zt)==qt[j])f[i][zt]+=max(f[i+1][zt],f[i+1][zt|Bin[j]]+a[j]); else f[i][zt]+=f[i+1][zt]; } f[i][zt]/=n; } printf("%.6lf",f[1][0]); return 0; }
1076: [SCOI2008]獎勵關