题意:给你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; }