Red is good(bzoj 1419)

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;
} 

 

posted @ 2017-03-03 19:21  karles~  阅读(198)  评论(0编辑  收藏  举报