诶自从经历了今年的联赛
已经不是特别怕数学期望dp了
F[i][j]表示剩i个红球,j个黑球时候的期望收入
F[i][j] = i/(i+j) * F[i-1][j] + j/(i+j) * F[i][j-1]
爆空间把一维滚掉就行了
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 5050
using namespace std;
typedef double db;
db f[2][N];
#define F f[i&1]
#define G f[i&1^1]
bool vis[N][N];
int main() {
int n,m; scanf("%d%d",&n,&m);
for (int i=0;i<=n;i++) {
memset(F,0,sizeof(F));
for (int j=0;j<=m;j++) {
if (i) F[j] += (db)i/(db)(i+j) * (G[j] + (db)1);
if (j) F[j] += (db)j/(db)(i+j) * (F[j-1] - (db)1);
if (F[j] < 0) F[j] = 0;
}
}
int i=n;
printf("%.6lf\n",F[m]-0.0000005);
return 0;
}