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;
}
posted @ 2022-12-27 20:34  Vijurria  阅读(14)  评论(0编辑  收藏  举报