BZOJ 1419 Red is good ——期望DP

定义f[i][j]表示还剩i张红牌,j张黑牌的时候能取得的期望最大值

显然有$f[i][j]=max(0,\frac {i}{i+j}(f[i-1][j]+1)+ \frac {j}{i+j}(f[i][j-1]-1))$

然后直接DP即可,发现卡内存,滚动数组即可。

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
 
int r,b,now,pre;
double f[2][5005];
 
int main()
{
    now=1;pre=0;scanf("%d%d",&r,&b);
    F(i,0,r)
    {
        now^=1;pre^=1;f[now][0]=i;
        F(j,1,b) f[now][j]=max(0.0,1.0*i/(i+j)*(f[pre][j]+1)+1.0*j/(i+j)*(f[now][j-1]-1));
    }
    ll ans=f[now][b]*1000000;
    printf("%.6f\n",1.0*ans/1000000);
}

  

posted @ 2017-04-05 17:09  SfailSth  阅读(222)  评论(0编辑  收藏  举报