定义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
",1.0*ans/1000000);
}