概率期望 WOJ 3808 Red is good

描述

桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付 出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。

输入

一行输入两个数R,B,其值在0到5000之间

输出

在最优策略下平均能得到多少钱。

样例输入

5 1

样例输出

4.166666

提示

输出答案时,小数点后第六位后的全部去掉,不要四舍五入.

题解

设f[i][j]为第i张红牌第j张黑牌是的期望
易得出f[i][j]=(f[i-1][j]+1)*i/(i+j)+(f[i][j-1]-1)*j/(i+j)
当f[i][j]<0时f[i][j]=0
开滚动数组不然会爆

代码

#include<bits/stdc++.h>
using namespace std;
double f[2][5005];
int r,b,now=0;
//( f[i-1][j]+1)*(i/(j+i)) + (f[i][j-1]-1)*(j/(i+j)))
int main()
{
	scanf("%d%d",&r,&b);
	for(int i=1;i<=r;i++)
	{
		now^=1;
		f[now][0]=i;
		for(int j=1;j<=b;j++)
		{
			double temp=(f[now][j-1]-1)*((double)j/(double)(j+i))+(f[now^1][j]+1)*((double)i/(double)(i+j));
			f[now][j]=temp>0?temp:0;
		}
	}
	printf("%.6lf",f[now][b]-0.0000005);
}
posted @ 2021-07-23 16:40  Socratize  阅读(31)  评论(0)    收藏  举报