/*
我们很容易得到e[i][j]表示做了前i题A了j题的概率
于是我们可以用s[i][j]记录e[m][(0~j)]的前缀和即表示第i队的 A(0~j)题的概率
*/
#include<stdio.h>
#include<string.h>
using namespace std;
const int M=55;
double e[M][M],p[1005][M],s[1005][M];
int main(){
int n,m,k;
while(~scanf("%d %d %d",&m,&n,&k)&&m){
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
scanf("%lf",&p[i][j]);
for(int i=1;i<=n;i++){
e[0][0]=1;
for(int j=1;j<=m;j++)e[j][0]=e[j-1][0]*(1-p[i][j]);
for(int j=1;j<=m;j++)for(int a=1;a<=j;a++)
e[j][a]=e[j-1][a]*(1-p[i][j])+e[j-1][a-1]*p[i][j];
s[i][0]=e[m][0];
for(int j=1;j<=m;j++)
s[i][j]=s[i][j-1]+e[m][j];
//表示第i队做出的题小于等于j的概率
}
double P1=1,P2=1;//分别表示每队全A的概率和每队只A 1~k-1题的概率
for(int i=1;i<=n;i++)P1*=(1-s[i][0]),P2*=(s[i][k-1]-s[i][0]);
printf("%.3f\n",P1-P2);
}
}
POJ 2151 Check the difficulty of problems
最新推荐文章于 2019-05-29 20:58:00 发布