tyvj1864 [Poetize I]守卫者的挑战

期望dp
不考虑打的顺序,只要最后能把地图都装下就行了,因此把概率和容量装进一个结构体里面,把地图放后面。
记一个状态f[i][j][k]表示前i个比赛,赢了j场,容量k的期望,转移即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=205;
struct RACE{int a;double p;}a[N];
int n,l,K;
double f[205][205][205];
bool cmp(RACE x,RACE y) {return x.a>y.a;}
int main() {
  scanf("%d%d%d",&n,&l,&K);
  for(int i=1;i<=n;i++) scanf("%lf",&a[i].p),a[i].p/=100;
  for(int i=1;i<=n;i++) scanf("%d",&a[i].a);
  f[0][0][min(200,K)]=1;
  sort(a+1,a+1+n,cmp);
  for(int i=0;i<n;i++) {
    for(int j=0;j<=i;j++) {
      for(int r=0;r<=n;r++) {
        f[i+1][j][r]+=f[i][j][r]*(1-a[i+1].p);
        if(r+a[i+1].a<0) continue;
        int t=min(r+a[i+1].a,n);
        f[i+1][j+1][t]+=f[i][j][r]*a[i+1].p;
      }
    }
  }
  double ans=0;
  for(int i=0;i<=n;i++) {
    for(int j=l;j<=n;j++)
    ans+=f[n][j][i];
  }
  printf("%.6lf",ans);
}
posted @ 2018-07-22 00:05  SWHsz  阅读(116)  评论(0编辑  收藏  举报