首页 > 其他 > 详细

【HDOJ】【4336】Card Collector

时间:2015-02-27 11:34:54      阅读:353      评论:0      收藏:0      [点我收藏+]

概率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(容斥原理)

 

【HDOJ】【4336】Card Collector

原文:http://www.cnblogs.com/Tunix/p/4302895.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!