传送门
显然的dp呀。
设f[i][j]表示还剩i张红,j张黑时的最有收益。
转移很好yy:f[i][j]=max(0,i/(i+j)(f[i-1][j]+1)+j/(i+j)(f[i][j-1]-1))
然后这题卡内存,要开滚存。
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
double f[2][5050];
int n,m,c;
double cal(double x){
return x<0?0:x;
}
int main(){
scanf("%d%d",&n,&m);
c=0;
for (int i=0;i<=n;i++){
f[c][0]=i;
for (int j=1;j<=m;j++)
f[c][j]=cal(1.0*i/(i+j)*(f[c^1][j]+1)+1.0*j/(i+j)*(f[c][j-1]-1));
c^=1;
}
long long ans=floor(f[n&1][m]*1e6);
printf("%lld.%06lld",ans/1000000,ans%1000000);
}