题目描述
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付
出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
输入
一行输入两个数R,B,其值在0到5000之间
输出
在最优策略下平均能得到多少钱。
样例输入
5 1
样例输出
4.166666
提示
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.
算是概率dp入门题了,f[i][j]表示剩下i张红牌j张黑牌的期望收益,f[i][j]=max(0,i/(i+j)*(1+f[i-1][j])+j/(i+j)*(-1+f[i][j-1])),转移很好理解,如果期望收益小于0了,那么剩下的就都不选了。注意内存较小要滚动数组且小数不要四舍五入。
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n,m;
double f[3][5010];
int main()
{
scanf("%d%d",&n,&m);
int now=0;
for(int i=1;i<=n;i++,now^=1)
{
f[now][0]=i;
for(int j=1;j<=m;j++)
{
f[now][j]=max(0*1.0,1.0*i/(i+j)*(1+f[now^1][j])+1.0*j/(i+j)*(-1+f[now][j-1]));
}
}
ll x=1000000*f[now^1][m];
printf("%.6lf",1.0*x/1000000);
}