从成功和失败两种情况转移
算成功的概率的时候,可以从失败的反向考虑比较简单。
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; const int mod=1e9+7; typedef long long ll; double f[15][13]; double a[N]; double b[N]; double c[N]; double d[N]; int main(){ int i; for(i=1;i<=12;i++){ cin>>a[i]; } for(i=1;i<=12;i++) cin>>b[i]; for(i=1;i<=12;i++) cin>>c[i]; for(i=1;i<=12;i++){ d[i]=(1-a[i])*(1-b[i])*(1-c[i]); d[i]=1-d[i]; } f[0][0]=1; for(i=1;i<=12;i++){ f[i][0]=f[i-1][0]*(1-d[i]); for(int j=1;j<=12;j++){ f[i][j]=f[i-1][j]*(1-d[i])+f[i-1][j-1]*d[i]; } } for(i=0;i<=12;i++){ printf("%.6f ",f[12][i]); } }