题意:给你N个硬币,每个硬币正面朝上的概率为p[i],反面朝上的概率为1 - p[i]
求正面朝上硬币数量比反面朝上硬币的数量多的概率是多少

设dp[i][j] 为前i个硬币有j个硬币朝上的概率和

所以可得出转移方程为:
dp[i][j + 1] += dp[i - 1][j] * p[i] //表示当前硬币为正面超市
dp[i][j] += dp[i - 1][j] * (1 - p[i]) // 表示当前硬币问反面朝上

#include <bits/stdc++.h>
#include <iostream>
#include <string.h>
#include <math.h>

using namespace std;
typedef long double lld;
const int mod = 1e9 + 7;
const int maxn = 3005;
lld dp[maxn][maxn];
// dp[i][j] 表示前i个硬币正面有j的概率和
lld p[maxn];

int main() {
//    freopen("in.in", "r", stdin);
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> p[i];
    }
    dp[1][1] = p[1];
    dp[1][0] = (1.0 - p[1]);
    for (int i = 2; i <= n; i++) {
        for (int j = 0; j < i; j++) {
            dp[i][j + 1] += dp[i - 1][j] * p[i];
            dp[i][j] += dp[i - 1][j] * (1 - p[i]);
        }
    }
    lld ans = 0;
    for (int i = n / 2 + n %2; i <= n;i++) {
        ans += dp[n][i];
    }
    printf("%.15Lf\n", ans);
    return 0;
}