题解:
我们知道一个题做不出的概率,用1减去就是能做的概率,然后直接概率dp就行了。 f ( i , j ) f(i,j) f(i,j)代表前i个题能做出j个题的概率。
#include <bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e6+10;
double a[N],b[N],c[N],d[N];
double f[100][100];
void solve()
{
for(int i=1;i<=12;i++) cin>>a[i];
for(int i=1;i<=12;i++) cin>>b[i];
for(int i=1;i<=12;i++) cin>>c[i];
for(int i=1;i<=12;i++){
d[i]=1.0-1.0*(1-a[i])*(1-b[i])*(1-c[i]);
// cout<<"----"<<d[i]<<endl;
}
f[0][0]=1;
for(int i=1;i<=12;i++){
f[i][0]=f[i-1][0]*(1-d[i]);
for(int j=1;j<=i;j++){
f[i][j]=f[i-1][j]*(1-d[i])+f[i-1][j-1]*d[i];
}
}
for(int i=0;i<=12;i++) printf("%.6lf\n",f[12][i]);
}
signed main()
{
solve();
}