题意:一场比赛总共有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]);(使用了容斥原理AB=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;
}

京公网安备 11010502036488号