【BZOJ 1419】1419: Red is good (概率DP)

1419: Red is good

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 807  Solved: 343

Description

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

Input

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

Output

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

Sample Input

5 1

Sample Output

4.166666

HINT

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

Source

【分析】

  概率DP这种东西想清楚就没问题。

  f[i][j]表示已经翻了i红j黑,之后最优策略下的期望得分。

  因为直接n^2数组0msT了,所以滚动了一下。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<cmath>
 7 using namespace std;
 8 #define Maxn 5010
 9 
10 double f[2][Maxn];
11 
12 double mymax(double x,double y) {return x>y?x:y;}
13 
14 int main()
15 {
16     int n,m;
17     scanf("%d%d",&n,&m);
18     f[n&1][m]=0;
19     for(int i=n;i>=0;i--)
20     {
21         int p=i&1,pp=p^1;
22         for(int j=m;j>=0;j--)
23         {
24              if(n==i) f[p][j]=mymax(f[p][j+1]-1,0);
25              else if(m==j) f[p][j]=mymax(f[pp][j]+1,0);
26              else f[p][j]=mymax((f[pp][j]+1)*(n-i)/(n+m-i-j)+(f[p][j+1]-1)*(m-j)/(n+m-i-j),0);
27         }
28     }
29     printf("%.6lf",f[0][0]-0.0000005);
30     return 0;
31 }
View Code

2017-04-21 16:08:56

原文地址:https://www.cnblogs.com/Konjakmoyu/p/6744051.html