Description
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
Input
一行输入两个数R,B,其值在0到5000之间
Output
在最优策略下平均能得到多少钱。
Sample Input
5 1
Sample Output
4.166666
HINT
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.
/* f[i][j]表示当前还剩i张红牌,j张黑牌的期望值。 那么容易得到转移式:f[i][j]=max(0,i/(i+j)*(f[i-1][j]+1)+j/(i+j)*(f[i][j-1]-1)) 注意要此题卡空间,要用滚动数组。 */ #include<cstdio> #include<iostream> #define N 5010 using namespace std; double f[2][N];int R,B; double fmax(double x){ if(x>0) return x; else return 0; } int main(){ scanf("%d%d",&R,&B); for(int i=0;i<=R;i++,f[i&1][0]=i) for(int j=1;j<=B;j++) f[i&1][j]=fmax(1.0*i/(i+j)*(f[i+1&1][j]+1)+1.0*j/(i+j)*(f[i&1][j-1]-1)); long long ans=f[R&1][B]*1000000; printf("%.6lf",(double)ans/1000000); return 0; }