[SCOI2008]奖励关

期望dp。
基本套路就是逆推一下,可以忽略不能到达的情况。因为n,K输入反,re2次。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int K,n;
double f[105][1<<15];int a[15],ned[15];
int main() {
  scanf("%d%d",&K,&n);
  for(int i=1,tp;i<=n;i++) {scanf("%d",&a[i]);scanf("%d",&tp);while(tp){ned[i]|=1<<(tp-1);scanf("%d",&tp);}}
  for(int i=K;i;i--)
  for(int j=0;j<(1<<n);j++){
  for(int k=1;k<=n;k++)
  if((j&ned[k])==ned[k]) f[i][j]+=max(f[i+1][j|(1<<k-1)]+a[k]*1.0,f[i+1][j]);
  else f[i][j]+=f[i+1][j];f[i][j]/=n*1.0;
  }
  printf("%.6lf",f[1][0]);
}
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9375404.html