题目:传送门。
分析:概率dp基础题,注意初始化就好了。直接上代码吧。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN=35,MAXT=1e3+5;
double dp[MAXN][MAXN],s[MAXN];
double p[MAXT][MAXN];
int main(){
int m,t,n;
while(cin>>m>>t>>n,m||t||n){
for(int i=1;i<=t;++i){
for(int j=1;j<=m;++j){
cin>>p[i][j];
}
}
double p1=1.0,p2=1.0;
for(int i=1;i<=t;++i){
dp[0][0]=1.0;
for(int j=1;j<=m;++j){
dp[j][0]=dp[j-1][0]*(1-p[i][j]);
}
for(int j=1;j<=m;++j){
for(int k=1;k<=j;++k){
dp[j][k]=dp[j-1][k-1]*p[i][j]+dp[j-1][k]*(1-p[i][j]);
}
}
s[0]=dp[m][0];
for(int j=1;j<=m;++j){
s[j]=s[j-1]+dp[m][j];
}
p1*=(s[m]-s[0]);
p2*=(s[n-1]-s[0]);
}
printf("%.3lf\n",p1-p2);
}
}