【BZOJ 1419】1419: Red is good (概率DP)
1419: Red is good
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 807 Solved: 343Description
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。Input
一行输入两个数R,B,其值在0到5000之间Output
在最优策略下平均能得到多少钱。Sample Input
5 1Sample Output
4.166666HINT
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.
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 }
2017-04-21 16:08:56