和今年寒假训练营有一题差不多。
那么对于第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; }