题意:一场比赛总共有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; }