#1506 : 投掷硬币

中文题

显然是要dp

dp[i][j]  考虑到 i 个 正面为j 个的概率 

dp[i][j]= dp[i-1][j]*(1-p[i])+dp[i-1][j-1]*p[i];

 

j=0特判下 

#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<map>
#include<queue>
#include<vector>
using namespace std;
#define ll long long


#define MAXN     1010

double dp[MAXN][MAXN];
double z[MAXN];

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    dp[0][0]=1;
    double sum=1;
    for(int i=1;i<=n;i++)
    {
         scanf("%lf",&z[i]);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=m;j++)
        {
            if(j==0)
                dp[i][j]=dp[i-1][j]*(1-z[i]);
            else
                dp[i][j]=dp[i-1][j]*(1-z[i])+dp[i-1][j-1]*z[i];
        }
     // cout<<endl;
    }
    printf("%.4lf\n",dp[n][m]);
    return 0;
}
View Code

 

posted on 2017-10-25 22:13  HelloWorld!--By-MJY  阅读(139)  评论(0编辑  收藏  举报

导航