您的位置:首页 > 其它

poj 2151 Check the difficulty of problems

2014-07-31 23:04 477 查看
dp[i][j][s]表示第i个人,在前j个问题解决了s个问题

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

#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
#include<cstring>
#include<stdlib.h>
#include<cmath>
using namespace std;
#define pb push_back
double dp[1010][35][35],p[1010][35];
int main(){
int n,m,k;
while(cin>>n>>m>>k&&(n+m+k)){
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%lf",&p[i][j]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
dp[i][0][0]=1;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
dp[i][j][0]=dp[i][j-1][0]*(1-p[i][j]);
for(int s=1;s<=j;s++)
dp[i][j][s]=dp[i][j-1][s-1]*p[i][j]+dp[i][j-1][s]*(1-p[i][j]);
}
}
double tmp=1,ko=1;
for(int i=1;i<=m;i++)
{
double tt=0;
for(int j=1;j<=n;j++)
tt+=dp[i]
[j];
ko*=tt;
}
for(int i=1;i<=m;i++)
{
double sum=0;
for(int j=1;j<k;j++)
sum+=dp[i]
[j];
tmp*=sum;
}
printf("%.3f\n",ko-tmp);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: