主要思路
概率 DP,显然地。
我们怎么来统计呢?在存下概率之后,我们枚举轮数并且枚举硬币向上的情况,之后转移即可,代码里一目了然。
代码
// I.cpp
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 3030;
int n;
double prob[MAX_N], dp[MAX_N][MAX_N];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lf", &prob[i]);
dp[0][0] = 1;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= i; j++)
{
int x = j, y = i - j;
if (x)
dp[x][y] += dp[x - 1][y] * prob[i];
if (y)
dp[x][y] += dp[x][y - 1] * (1 - prob[i]);
}
double ans = 0;
for (int i = 0; n - i > i; i++)
ans += dp[n - i][i];
printf("%.10lf", ans);
return 0;
}