BZOJ——1419: Red is good

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ——1419: Red is good相关的知识,希望对你有一定的参考价值。

http://www.lydsy.com/JudgeOnline/problem.php?id=1419

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1077  Solved: 491
[Submit][Status][Discuss]

Description

桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。

Input

一行输入两个数R,B,其值在0到5000之间

Output

在最优策略下平均能得到多少钱。

Sample Input

5 1

Sample Output

4.166666

HINT

输出答案时,小数点后第六位后的全部去掉,不要四舍五入.

Source

 

f[r][b]表示选r个红牌 b个黑牌在 最优策略 平均 能得到的钱

f[r][b]=max( 0, (f[r-1][b]+1)*r/(r+b)+(f[r][b-1]-1)*b/(r+b) )

//当前选一张红牌的概率为r/(r+b),红牌钱数+1,期望为f[r-1][b]+1)*r/(r+b),选黑牌类似

但是T了。。。然后、、需要用滚动数组优化第一维、

 

 1 #include <cstdio>
 2 
 3 #define max(a,b) (a>b?a:b)
 4 
 5 inline void read(int &x)
 6 {
 7     x=0; register char ch=getchar();
 8     for(; ch>9||ch<0; ) ch=getchar();
 9     for(; ch>=0&&ch<=9; ch=getchar()) x=x*10+ch-0;
10 }
11 
12 const int N(5e3+5);
13 
14 double f[N];
15 int R,B;
16 
17 int Presist()
18 {
19     read(R),read(B);
20     for(int r=1; r<=R; ++r)
21     {
22         f[0]=r;
23         for(int b=1; b<=B; ++b)
24               f[b]=max(0.00,1.*(f[b]+1)*r/(r+b)+
25                             1.*(f[b-1]-1)*b/(r+b));
26     }
27     printf("%.6lf\n",f[B]-5e-7);
28     return 0;
29 }
30 
31 int Aptal=Presist();
32 int main(int argc,char**argv){;}

 

以上是关于BZOJ——1419: Red is good的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ-1419Red is good 概率期望DP

BZOJ1419 Red is good [期望DP]

bzoj1419Red is good

BZOJ1419 Red is good

BZOJ 1419Red is good [概率DP]

[BZOJ1419] Red is good(期望DP)