题目大意
桌面上有
R
张红牌和
0≤R,B≤5000
题解
设
fi,j
为还剩下
i
张红牌和
fi,0f0,ifi,j=i=0=max(0,i(fi−1,j+1)+j(fi,j−1−1)i+j)
最后答案是 fR,B
辣鸡出题人卡空间要用滚动数组才能过
时间复杂度: O(RB)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
double f[2][5010];
int main()
{
// freopen("bzoj1419.in","r",stdin);
int n,m;
scanf("%d%d",&n,&m);
int i,j;
int t=0;
for(i=0;i<=n;i++)
{
t^=1;
f[t][0]=i;
for(j=1;j<=m;j++)
f[t][j]=max(0.,(f[t^1][j]+1)*double(i)/(i+j)+(f[t][j-1]-1)*double(j)/(i+j));
}
ll s=f[t][m]*1000000;
printf("%lld.%.6lld\n",s/1000000,s%1000000);
return 0;
}