【HDOJ】【4336】Card Collector

概率DP/数学期望/状压DP/容斥原理

  kuangbin总结中的第14题

  好神奇的做法……题解看kuangbin的代码好了……

 1 //HDOJ 4336
 2 #include<cstdio>
 3 #define rep(i,n) for(int i=0;i<n;++i)
 4 #define F(i,j,n) for(int i=j;i<=n;++i)
 5 #define D(i,j,n) for(int i=j;i>=n;--i)
 6 const int N=22;
 7 
 8 double p[N],f[1<<N];
 9 int main(){
10     int n;
11     while(scanf("%d",&n)!=EOF){
12         double tt=0.0;
13         rep(i,n){
14             scanf("%lf",&p[i]);
15             tt+=p[i];
16         }
17         tt=1-tt;
18         f[(1<<n)-1]=0;
19         D(i,(1<<n)-2,0){
20             double x=0,sum=1.0;
21             rep(j,n)
22                 if(i & (1<<j))x+=p[j];
23                 else sum+=p[j]*f[i|(1<<j)];
24             f[i]=sum/(1-tt-x);
25         }
26         printf("%.5lf\n",f[0]);
27     }
28     return 0;
29 }
View Code(概率DP)
 1 //HDOJ 4336
 2 #include<cstdio>
 3 #define rep(i,n) for(int i=0;i<n;++i)
 4 #define F(i,j,n) for(int i=j;i<=n;++i)
 5 
 6 double p[22];
 7 int main(){
 8     int n;
 9     while(scanf("%d",&n)!=EOF){
10         rep(i,n) scanf("%lf",&p[i]);
11         double ans=0;
12         for(int i=1;i<(1<<n);++i){
13             int cnt=0; double sum=0;
14             rep(j,n) if(i&(1<<j)){
15                 sum+=p[j];
16                 cnt++;
17             }
18             if (cnt&1) ans+=1.0/sum;
19             else ans-=1.0/sum;
20         }
21         printf("%.5lf\n",ans);
22     }
23     return 0;
24 }
View Code(容斥原理)

 

posted @ 2015-02-27 11:09  Tunix  阅读(163)  评论(0编辑  收藏  举报