bzoj 1419 Red is good - 动态规划 - 概率与期望

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 }
posted @ 2017-12-16 21:50  阿波罗2003  阅读(124)  评论(0编辑  收藏  举报