第二题过了91%
int main() {
int n = 0, m = 0; // red blue
cin >> n >> m;
vector<vector<double>> dp(n + 1, vector<double>(m + 1, 0));
for (int j = 0; j <= m; ++j) {
dp[0][j] = 0;
}
for (int i = 0; i <= n; ++i) {
dp[i][0] = 1;
dp[i][1] = i / (i + 1.0);
}
for (int i = 1; i <= n; ++i) {
for (int j = 2; j <= m; ++j) {
double ns = i, ms = j;
double all = i + j;
double res = (ns) / all;
if (j >= 3) {
dp[i][j] = res + (ms / all) * (ms - 1) / (all - 1) *
((ms - 2) / (all - 2) * dp[i][j - 3] + (ns / (all - 2)) * dp[i - 1][j - 2]);
} else if (j == 2) {
dp[i][j] = res + (ms / all) * ((ms - 1) / (all - 1)) * (ns / (all - 2)) * dp[i - 1][j - 2];
}
}
}
cout << setiosflags(ios::fixed) << setprecision(5) << dp[n][m];
return 0;
}