题意:一场比赛总共有12个题,对于第i个题,有a[i]的几率解决它,如果不能解决,则你有b[i]的概率从左边那个队那里听会这个题的做法,有c[i]的概率从右边那个队那里听会这个题的做法,请问最终你们队伍解出0-12题的概率分别是多少?

思路:每一题单独的解决概率的d[i]=a[i]+(1-a[i])(b[i]+c[i]-b[i]*c[i]);(使用了容斥原理A图片说明B=A+B-A图片说明 B )
然后dp,f[i][j]为前i道题解决j道题的概率
f[i][j]=f[i-1][j]
(1-d[i])+f[i-1][j-1]*d[i];
初始化:f[0][0]=1;

代码:

#include<bits/stdc++.h>
#define ll long long
#define inf 1000000007

using namespace std;

double a[15], b[15], c[15], d[15], f[15][15];

int main()
{
    for(int i=1; i<=12; i++)
    {
        scanf("%lf",&a[i]);
    }
    for(int i=1; i<=12; i++)
    {
        scanf("%lf",&b[i]);
    }
    for(int i=1; i<=12; i++)
    {
        scanf("%lf",&c[i]);
    }
    for(int i=1; i<=12; i++)
    {
        d[i]=a[i]+(1-a[i])*(b[i]+c[i]-c[i]*b[i]);
    }
    f[0][0]=1;
    for(int i=1; i<=12; i++)
    {
        for(int j=0; j<=12; j++)
        {
            f[i][j]=f[i-1][j]*(1-d[i]);
            if(j!=0)
                f[i][j]+=f[i-1][j-1]*d[i];
        }
    }
    for(int i=0; i<=12; i++)
    {
        printf("%.6f\n",f[12][i]);
    }
    return 0;
}