poj 2151 Check the difficulty of problems

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]);

 1 #include<iostream>
 2 #include<string>
 3 #include<cstdio>
 4 #include<vector>
 5 #include<queue>
 6 #include<stack>
 7 #include<algorithm>
 8 #include<cstring>
 9 #include<stdlib.h>
10 #include<cmath>
11 using namespace std;
12 #define pb push_back
13 double dp[1010][35][35],p[1010][35];
14 int main(){
15     int n,m,k;
16     while(cin>>n>>m>>k&&(n+m+k)){
17         for(int i=1;i<=m;i++)
18             for(int j=1;j<=n;j++)
19             scanf("%lf",&p[i][j]);
20         memset(dp,0,sizeof(dp));
21         for(int i=1;i<=m;i++)
22             dp[i][0][0]=1;
23         for(int i=1;i<=m;i++){
24             for(int j=1;j<=n;j++){
25                  dp[i][j][0]=dp[i][j-1][0]*(1-p[i][j]);
26                  for(int s=1;s<=j;s++)
27                  dp[i][j][s]=dp[i][j-1][s-1]*p[i][j]+dp[i][j-1][s]*(1-p[i][j]);
28             }
29         }
30         double tmp=1,ko=1;
31         for(int i=1;i<=m;i++)
32         {
33             double tt=0;
34             for(int j=1;j<=n;j++)
35             tt+=dp[i][n][j];
36             ko*=tt;
37         }
38         for(int i=1;i<=m;i++)
39         {
40             double sum=0;
41             for(int j=1;j<k;j++)
42                 sum+=dp[i][n][j];
43             tmp*=sum;
44         }
45         printf("%.3f
",ko-tmp);
46     }
47 }
原文地址:https://www.cnblogs.com/ainixu1314/p/3883764.html