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 };