1. 程式人生 > >1076: [SCOI2008]獎勵關

1076: [SCOI2008]獎勵關

獎勵 %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]獎勵關