Educational DP Contest I - Coins(概率DP)
https://atcoder.jp/contests/dp/tasks/dp_i
题目大意:
给定n个硬币,n是奇数,每个硬币朝上的概率是ai
问我们一半以上的硬币处于正面的概率是多少?
Sample Input 1
3
0.30 0.60 0.80
Sample Output 1
0.612
注意状态转移方程
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=500200,M=3500;
const LL mod=1e9+7;
double a[N];
double f[M][M];//前i个硬币,有j个是正面
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
LL n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
//当只有一个硬币时只有这两种情况
f[1][0]=(1-a[1]);
f[1][1]=a[1];
for(int i=2;i<=n;i++)
{
for(int j=0;j<=i;j++)
{
//没有正面的硬币时==全反
if(j==0) f[i][j]=f[i-1][j]*(1-a[i]);
//在前i-1个硬币时,有j-1个硬币正面,第i个硬币是正面,概率为f[i-1][j-1]*a[i];
//在前i-1个硬币时,有j个硬币正面,第i个硬币是反面,概率为f[i-1][j]*(1-a[i]);
else f[i][j]=f[i-1][j-1]*a[i]+f[i-1][j]*(1-a[i]);
}
}
double ans=0;
for(int i=(n+1)/2;i<=n;i++)//正的数量要比反的数量更多,n是奇数,所以是从(n+1)/2开始加
{
ans+=f[n][i];
}
printf("%.10lf\n",ans);
}
return 0;
}