和今年寒假训练营有一题差不多。

图片说明
那么对于第i道题,如果要想做对,只需要满足 a[i],b[i],c[i]之中其中一个就可以,直接计算做对的概率比较麻烦,我们可以进行求反,即做不对这道题的概率 很容易得到为图片说明 ,即三次都没解决。
那么正确的概率自然就是1-上面的式子。

容易得到转移方程如下
dp[i][j]=dp[i-1][j-1] * yes + dp[i-1][j] * no
其中yes为答案第i道题的概率,no为答错的概率。也就是前i道题答对j道,要么第i题答错了,那么前i-1道题就需要对j道。
要么第i题答对了,那么需要前i-1道对j-1道。
注意初始化dp[0][0]=1

#include<bits/stdc++.h>
using namespace std;
double a[13],b[13],c[13];
double dp[13][13];
int main(){
    int n=12;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    for(int i=1;i<=n;i++) cin>>c[i];
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        dp[i][0]=dp[i-1][0]*((1-a[i])*(1-b[i])*(1-c[i]));
        for(int j=1;j<=i;j++){
            double no=(1-a[i])*(1-b[i])*(1-c[i]);
            double yes=1-no;
            dp[i][j]=dp[i-1][j-1]*yes+dp[i-1][j]*no;
        }
    }
    for(int i=0;i<=n;i++) printf("%.6f\n",dp[n][i]);
    return 0;
}