http://www.gdfzoj.com/oj/problem/470
Problem Description
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。 输出答案时,小数点后第六位后的全部去掉,不要四舍五入.
Input
一行输入两个数R,B,其值在0到5000之间
Output
在最优策略下平均能得到多少钱。
Sample Input
5 1
Sample Output
4.166666
设f[i,j]为拿i张红牌,拿j张黑牌的期望,则
f(i,j)=ii+j∗(f(i−1,j)+1)+ji+j∗(f(i,j−1)−1);
#include <cstdio>
double f[5010][5010];
int R,B;
int main(){
scanf("%d%d",&R,&B);
for (int i=0; i<=R; i++)
for (int j=0; j<=B; j++){
if (i>0) f[i][j]+=(double)i/(double)(i+j)*(f[i-1][j]+1);
if (j>0) f[i][j]+=(double)j/(double)(i+j)*(f[i][j-1]-1);
if (f[i][j]<0) f[i][j]=0;
}
printf("%.6f",f[R][B]-0.0000005);
}