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\n",ko-tmp); 46 } 47 }
poj 2151 Check the difficulty of problems,布布扣,bubuko.com
时间: 2024-10-24 13:40:28