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;
}

  

posted @ 2014-11-20 15:09  chenjunjie1994  阅读(189)  评论(0编辑  收藏  举报