B20J_1419_Red Is Good_期望DP

B20J_1419_red is good_期望DP

题意:

有R张红牌和B张黑牌,一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。

分析:

期望DP。

状态描述:f[i][j]表示当前有i张红牌,j张黑牌能够获得钱数的期望。

转移:考虑当前翻开的是什么牌。

f[i][j]=max{0,(f[i-1][j]+1)*i/(i+j)+(f[i][j-1]-1)*j/(i+j)}.

对最优策略的理解:如果当前获得钱为负数就没有必要转移了。

其他:1.题目要求截断保留6位小数。2.空间需要滚动优化。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define du double
#define eps 1e-8
du f[2][5010],ans;
int r,b;
int main()
{
    scanf("%d%d",&r,&b);
    for(int i=1;i<=r;i++)
    {
        f[i&1][0]=i;
        for(int j=1;j<=b;j++)
        {
            f[i&1][j]=max(0.0,
                       (f[(i-1)&1][j]+1)*i/(1.0*(i+j))
                         +
                         (f[i&1][j-1]-1)*j/(1.0*(i+j)));
        }
    }
    printf("%.6lf",max(0.0,f[r&1][b]-0.0000005));
}
 
/***************************************************************
    Problem: 2453
    User: 20170105
    Language: C++
    Result: Accepted
    Time:432 ms
    Memory:1040 kb
****************************************************************/

  

 

posted @ 2018-02-03 22:57  fcwww  阅读(168)  评论(0编辑  收藏  举报