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
****************************************************************/