poj2151

来源:互联网 发布:主力建仓优化指标 编辑:程序博客网 时间:2024/05/18 20:46

题意大概是给出m道题,T支队,n,问求出每个人至少做出一道题而且冠军队至少做出n道题的概率。

明显概率dp问题,不知道关hash 什么事,渣渣不懂。

P[i][j]表示第I支队过第j道题的概率

F[i][j][k]表示第i支队在前j道题中过了k道题的概率

则可以得到F[i][j][k]=F[i][j-1][k-1]*p[i][j]+F[i][j-1][k]*(1-p[i][j]);

然后再确认一些临界调价就差不多了。

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <stdlib.h>
using namespace std;
double p[1005][32],F[1005][32][32];
int main()
{
    int m,n,t;
    while(cin>>m>>t>>n)
    {
        if(m==0)break;
        memset(p,0.0,sizeof(p));
        memset(F,0.0,sizeof(F));
        for(int i=1;i<=t;i++)
            for(int j=1;j<=m;j++)
            {
                F[i][0][0]=1.0;
               scanf("%lf",&p[i][j]);
            }
            double p1=1.0,p2=1.0;
            for(int i=1;i<=t;i++)
                for(int j=1;j<=m;j++)
            {
                F[i][j][0]=F[i][j-1][0]*(1-p[i][j]);
                for(int k=1;k<=j;k++)
                F[i][j][k]=F[i][j-1][k-1]*p[i][j]+F[i][j-1][k]*(1-p[i][j]);
            }
            for(int i=1;i<=t;i++)
                p1=p1*(1-F[i][m][0]);
            for(int i=1;i<=t;i++)
            {
                double ans=0.0;
                for(int j=1;j<n;j++)//注意,这里一开始从零开始算了。。。然后wa了,是在每队至少过一题的情况下考虑冠军队过不了n题
                    ans+=F[i][m][j];
                p2=p2*ans;
            }
            p1=p1-p2;
           printf("%.3f\n",p1);
    }
    return 0;
}

0 0
原创粉丝点击