第二题过了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;
}