题意:给你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;
} 
京公网安备 11010502036488号