POJ 2151 Check the difficulty of problems

来源:互联网 发布:淘宝开店显示已有店铺 编辑:程序博客网 时间:2024/05/16 00:52
Check the difficulty of problems
Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 3456 Accepted: 1521

Description

Organizing a programming contest is not an easy job. To avoid making the problems too difficult, the organizer usually expect the contest result satisfy the following two terms:
1. All of the teams solve at least one problem.
2. The champion (One of those teams that solve the most problems) solves at least a certain number of problems.

Now the organizer has studied out the contest problems, and through the result of preliminary contest, the organizer can estimate the probability that a certain team can successfully solve a certain problem.

Given the number of contest problems M, the number of teams T, and the number of problems N that the organizer expect the champion solve at least. We also assume that team i solves problem j with the probability Pij (1 <= i <= T, 1<= j <= M). Well, can you calculate the probability that all of the teams solve at least one problem, and at the same time the champion team solves at least N problems?

Input

The input consists of several test cases. The first line of each test case contains three integers M (0 < M <= 30), T (1 < T <= 1000) and N (0 < N <= M). Each of the following T lines contains M floating-point numbers in the range of [0,1]. In these T lines, the j-th number in the i-th line is just Pij. A test case of M = T = N = 0 indicates the end of input, and should not be processed.

Output

For each test case, please output the answer in a separate line. The result should be rounded to three digits after the decimal point.

Sample Input

2 2 20.9 0.91 0.90 0 0

Sample Output

0.972

Source

POJ Monthly,鲁小石
这道题目真是让人头疼,不可否认的是这题概率与dp有一个很好的结合。让人头疼的是条件概率的不断的正反向运用,很容易把人搞晕
#include <stdio.h>#include <string.h>#include <math.h>double a[1100][35][35];double val1[1100],val2[1100],p[1100][35];double res1,res2;int main(){    int i,j,n,m,s,t,x;    while(scanf("%d %d %d",&n,&m,&t)!=EOF)    {        if(!n&&!m&&!t)        {            break;        }        for(i=1;i<=m;i++)        {            for(j=1;j<=n;j++)            {                scanf("%lf",&p[i][j]);            }        }        for(i=1;i<=m;i++)        {            val1[i]=1.0;            for(j=1;j<=n;j++)            {                val1[i]=val1[i]*(1-p[i][j]);            }            val1[i]=1-val1[i];        }        memset(a,0,sizeof(a));        for(i=1;i<=m;i++)        {            a[i][0][0]=1;            for(j=1;j<=n;j++)            {                a[i][j][0]=a[i][j-1][0]*(1-p[i][j]);            }        }        for(i=1;i<=m;i++)        {            for(j=1;j<=n;j++)            {                for(x=1; x<=j;x++)                {                    a[i][j][x]=(a[i][j-1][x-1]*p[i][j])+(a[i][j-1][x]*(1-p[i][j]));                }            }        }        for(i=1;i<=m;i++)        {            val2[i]=0;            for(j=t;j<=n;j++)            {                val2[i]+=a[i][n][j];            }            if(fabs(val1[i])>1e-7)            {                val2[i]=val2[i]/val1[i];            }else            {                val2[i]=0;            }        }        res1=1.0; res2=1.0;        for(i=1;i<=m;i++)        {            res1=res1*(1-val2[i]);            res2=res2*val1[i];        }        printf("%.3lf\n",(1-res1)*res2);    }    return 0;}

 
原创粉丝点击