TopCoder9915(期望dp)

1.还是逆向。

2.状态是还剩红i黑j张时的期望,这样从0,0往R,B推。注意因为是逆着的,所以到了某一步发现期望为负时直接f[i][j]归零,意义是这之后(在递推中算是这之前)的都不摸了,到这就停(根据题意随时可以停手),所以相当于是从这个时候开始摸,所以为0.

3.滚动数组因为是无视j的,所以j和j-1要无形中体现出来,所以j放外层循环。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 typedef double db;
 6 const int maxn = 5005;
 7 
 8 class RedIsGood {
 9     public:
10         db f[maxn];
11         db max(db a, db b) {
12             return a > b ? a : b;
13         }
14         db getProfit(int R, int B) {
15             for (int i = 0; i <= R; i++)    f[i] = i;
16             for (int j = 1; j <= B; j++) {
17                 for (int i = 1; i <= R; i++) {
18                     f[i] = max(0, (db)(f[i - 1] + 1) * i / (i + j) + (db)(f[i] - 1) * j / (i + j));
19                 }
20             }
21             return f[R];
22         }
23 };

猜你喜欢

转载自www.cnblogs.com/AlphaWA/p/10527361.html