BZOJ 1076 [SCOI2008]獎勵關【狀態壓縮】【期望DP】
阿新 • • 發佈:2018-12-19
基於hzwer的部落格。
表示可以獲得得前提。
考慮倒推,當前狀態的期望=(上一個狀態的期望+這次得到的價值)/概率
#include <bits/stdc++.h> #define db double #define ll long long using namespace std; const ll N=15; const ll M=105; const ll Inf=1e18; ll k,n,all,v[N+1],lim[N+1]; db f[M][1<<N]; int main() { scanf("%lld%lld",&n,&k);all=(1<<k)-1; for(ll i=1;i<=k;i++) { ll l; scanf("%lld%lld",&v[i],&l); while(l) { lim[i]|=(1<<(l-1)); scanf("%lld",&l); } } for(ll i=n;i>=1;i--) for(ll j=0;j<=all;j++) { for(ll p=1;p<=k;p++) { if((lim[p]&j)==lim[p]) f[i][j]+=max(f[i+1][j],f[i+1][j|(1<<(p-1))]+v[p]); else f[i][j]+=f[i+1][j]; } f[i][j]/=k; } printf("%.6lf",f[1][0]); return 0; }