问题:
求出解出0道-12道题的概率!!!
分析:
正难则反,先求出每个题解不出的概率。 、
然后设dp[i][j]表示前i道题解出j道的概率
那么初始化dp[0][0]=1;
设d[i]表示第i道题解出的概率
注意:前i道题解出0道的情况单独算,等于前i-1道题解不出的概率乘上第i道题解不出的概率。(因为它不存在解出和解不出两种情况,只有解不出的情况)
即dp[i][0]=dp[i-1][0](1-d[i])
由于每个题有解出和解不出两种情况,则
dp[i][j]=dp[i-1][j](1-d[i])+dp[i-1][j-1]*d[i]
如果第i道解不出,那么需要前i-1道解出j道题;
如果第i道解出,那么就需要前i-1道解出j-1道
考察:
dp动态规划
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 13;
double a[N],b[N],c[N],d[N],dp[N][N];
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=0;i<=12;i++) {
d[i]=(1-a[i])*(1-b[i])*(1-c[i]);//正难则反,先算出解不出的概率
d[i]=1-d[i];//再求出解得出的概率
}
dp[0][0]=1;//初始化前0道题解出0道概率为1
for(int i=1;i<=12;i++){//枚举前i道题
dp[i][0]=dp[i-1][0]*(1-d[i]);//前i道题解出0道的概率要单独算,这时等于前i-1道解出0道的概率乘上这道题解不出的概率
for(int j=1;j<=i;j++){
//前i道题解出j道的概率:
/*
如果第i道题解不出,那么需要前i-1道题解出j道;
如果第i道题解出,那么需要前i-1道解出j-1道
*/
dp[i][j]=dp[i-1][j]*(1-d[i])+dp[i-1][j-1]*d[i];
}
}
for(int i=0;i<=12;i++){
printf("%.6lf\n",dp[12][i]);
}
return 0;
}