Red is good题解 5.22
题目描述
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
输入格式
一行输入两个数R,B,其值在0到5000之间
输出格式
在最优策略下平均能得到多少钱。
样例
样例输入
5 1
样例输出
4.166666
数据范围与提示
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.
其实就是一个递推式
求选牌的期望
double一个f[i][j]表示还剩i个红牌,j个黑牌
f[i][j]=i/(i+j)*(f[i-1][j]+1)+j/(i+j)*(f[i][j-1]-1)
注意i>0时,前半部分成立,因为i=0时,i-1=-1 会re
同理j>0
!!!!!!!!!若f[i][j]<0 则把f[i][j]赋成0
因为f[i][j]<0还不如不选(此处的不选指一张都不选)
小窍门:可以直接-0.0000005以达成不四舍五入输出六位小数的目的
代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
int a,b;
double f[5010][5010];
int main()
{
cin>>a>>b;
for(int i=0;i<=a;i++)
for(int j=0;j<=b;j++)
{
if(i>0) f[i][j]=1.0*i/(i+j)*(f[i-1][j]+1);
if(j>0) f[i][j]+=1.0*j/(i+j)*(f[i][j-1]-1);
if(f[i][j]<0) f[i][j]=0;
}
printf("%.6lf",f[a][b]-0.0000005);
}
浙公网安备 33010602011771号