Description
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付
出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.
Solution
感觉概率期望什么的还是不太会
这题可以设f[i,j]为局面为红牌i张黑牌j张的最优期望,那么抽到红牌的概率就是
ij+i
i
j
+
i
,黑牌
jj+i
j
j
+
i
,初始状态f[i,0]=i(只有一种牌的时候,转移比较显然
还可以设f[i,j]为已经翻开了红牌i张黑牌j张的最优期望,那么实际上就是变成了上面的f[r-i,b-j],这样也可以做
做概率期望dp的时候通常要倒过来转移,因为起始状态往往固定而终止状态往往不唯一
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
const int N=5005;
double f[2][N];
int main(void) {
int r,b; scanf("%d%d",&r,&b);
rep(i,1,r) {
f[i&1][0]=i;
rep(j,1,b) {
double s1=1.0*i/(1.0*i+j);
double s2=1.0*j/(1.0*i+j);
f[i&1][j]=std:: max(0.0,(f[(i&1)^1][j]+1)*s1+(f[i&1][j-1]-1)*s2);
}
}
printf("%.6lf\n", f[r&1][b]-5e-7);
return 0;
}