B20J_1419_Red Is Good_期望DP
B20J_1419_red is good_期望DP
题意:
有R张红牌和B张黑牌,一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
分析:
期望DP。
状态描述:f[i][j]表示当前有i张红牌,j张黑牌能够获得钱数的期望。
转移:考虑当前翻开的是什么牌。
f[i][j]=max{0,(f[i-1][j]+1)*i/(i+j)+(f[i][j-1]-1)*j/(i+j)}.
对最优策略的理解:如果当前获得钱为负数就没有必要转移了。
其他:1.题目要求截断保留6位小数。2.空间需要滚动优化。
代码:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define du double #define eps 1e-8 du f[2][5010],ans; int r,b; int main() { scanf("%d%d",&r,&b); for(int i=1;i<=r;i++) { f[i&1][0]=i; for(int j=1;j<=b;j++) { f[i&1][j]=max(0.0, (f[(i-1)&1][j]+1)*i/(1.0*(i+j)) + (f[i&1][j-1]-1)*j/(1.0*(i+j))); } } printf("%.6lf",max(0.0,f[r&1][b]-0.0000005)); } /*************************************************************** Problem: 2453 User: 20170105 Language: C++ Result: Accepted Time:432 ms Memory:1040 kb ****************************************************************/