数学期望/期望DP
还是戳《浅析竞赛中一类数学期望问题的解决方法》这篇论文……
$$ f[i][j]= egin{cases} 0 &, &i==0 \ f[i-1][j]+1 &, &i>0,j=0 \ max{0,(f[i-1][j]+1)*frac{i}{i+j} + (f[i][j-1]-1)* frac{j}{i+j}} &, &i>0,j>0 end{cases} $$
然而TLE了一发……因为空间限制,所以只能开滚动数组,直接开$N^2$的挂了……
1 /************************************************************** 2 Problem: 1419 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:2188 ms 7 Memory:1352 kb 8 ****************************************************************/ 9 10 //BZOJ 1419 11 #include<cstdio> 12 #include<cstring> 13 #include<cstdlib> 14 #include<iostream> 15 #include<algorithm> 16 #define rep(i,n) for(int i=0;i<n;++i) 17 #define F(i,j,n) for(int i=j;i<=n;++i) 18 #define D(i,j,n) for(int i=j;i>=n;--i) 19 #define pb push_back 20 using namespace std; 21 const int N=5010; 22 /*******************template********************/ 23 24 int n,m; 25 double f[2][N]; 26 27 int main(){ 28 #ifndef ONLINE_JUDGE 29 freopen("1419.in","r",stdin); 30 freopen("1419.out","w",stdout); 31 #endif 32 scanf("%d%d",&n,&m); 33 F(i,0,n) F(j,0,m){ 34 int now=i&1; 35 if (i==0){f[now][j]=0;continue;} 36 if (j==0){f[now][j]=f[now^1][j]+1;continue;} 37 f[now][j]=max(0.0,(f[now^1][j]+1)*i/double(i+j)+(f[now][j-1]-1)*j/double(i+j)); 38 } 39 printf("%.6f ",f[n&1][m]-0.0000005); 40 return 0; 41 }
1419: Red is good
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 426 Solved: 144
[Submit][Status][Discuss]
Description
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
Input
一行输入两个数R,B,其值在0到5000之间
Output
在最优策略下平均能得到多少钱。
Sample Input
5 1
Sample Output
4.166666
HINT
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.