HDU 4336
概率DP期望,逆推即可。使用状态压缩。
注意,要全部输出。。。看DIS才发现题目输出是个坑。。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
double state[(1<<20)+10];
double ps[25];
int main(){
int n; double noted,is;
while(scanf("%d",&n)!=EOF){
double fail=1;
for(int i=0;i<n;i++){
scanf("%lf",&ps[i]);
fail-=ps[i];
}
int al=(1<<n)-1;
for(int i=al;i>=0;i--){
if(i==al){
state[i]=0;
continue;
}
noted=fail;is=1;
for(int k=0;k<n;k++){
if(i&(1<<k)){
noted+=ps[k];
}
else{
is+=(ps[k]*state[i|(1<<k)]);
}
}
state[i]=is/(1-noted);
}
printf("%lf\n",state[0]);
}
return 0;
}

浙公网安备 33010602011771号