题目描述
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
输入
一行输入两个数R,B,其值在0到5000之间
输出
在最优策略下平均能得到多少钱。
样例输入
5 1
样例输出
4.166666
题解
期望dp
设$f[i][j]$表示还有$i$张红牌和$j$张黑牌是最优策略的期望收益。
那么显然$f[i][j]=max(frac i{i+j}(f[i-1][j]+1)+frac j{i+j}(f[i][j-1]-1),0)$,因为当期望为负时可以选择不选。
这里为了避免边界条件而将数组平移了1位。
最终答案为$f[n][m]$,由于卡空间,需要使用滚动数组。
#include <cstdio> #include <algorithm> #define N 5010 using namespace std; double f[2][N]; int main() { int n , m , i , j , d; scanf("%d%d" , &n , &m); for(i = d = 1 ; i <= n + 1 ; i ++ , d ^= 1) for(j = 1 ; j <= m + 1 ; j ++ ) if(i != 1 || j != 1) f[d][j] = max((f[d ^ 1][j] + 1) * (double)(i - 1) / (i + j - 2) + (f[d][j - 1] - 1) * (double)(j - 1) / (i + j - 2) , 0.0); printf("%.6lf " , f[(n + 1) & 1][m + 1] - 0.0000005); return 0; }