Description
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
Input
一行输入两个数R,B,其值在0到5000之间
Output
在最优策略下平均能得到多少钱。
Sample Input
5 1
Sample Output
4.166666
HINT
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.
(题目太简洁,不需要大意)
这道题和poj的Collecting Bugs有些类似,一样是倒推。
用f[i][j]表示i张红牌和j张黑白时的最优答案。
对于初值显然有 f[i][0] = 0 ,对于转移,根据题目意思转移就好了,考虑是摸到红牌还是黑牌,然后和0取max。
Code‘
1 /** 2 * bzoj 3 * Problem#1419 4 * Accepted 5 * Time: 1388ms 6 * Memory: 1368k 7 */ 8 #include <bits/stdc++.h> 9 using namespace std; 10 #define smax(_a, _b) _a = (_a > _b) ? (_a) : (_b) 11 12 const int N = 5005; 13 14 int R, B; 15 double f[2][N]; 16 17 inline void init() { 18 scanf("%d%d", &R, &B); 19 } 20 21 inline void solve() { 22 int t = 0; 23 for(int i = 1; i <= R; i++) { 24 t ^= 1; 25 f[t][0] = i; 26 for(int j = 1; j <= B; j++) { 27 f[t][j] = (f[t ^ 1][j] + 1.0) * i + (f[t][j - 1] - 1.0) * j; 28 f[t][j] /= i + j; 29 if(f[t][j] < 0) 30 f[t][j] = 0; 31 } 32 } 33 printf("%.6lf", f[t][B] - 5e-7); 34 } 35 36 int main() { 37 init(); 38 solve(); 39 return 0; 40 }