hdu4649Professor Tian

http://acm.hdu.edu.cn/showproblem.php?pid=4649

枚举当前状态是0或者是1的概率 其实就枚举1的概率 最后概率乘这个数

位运算用得不熟  老出错

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<stdlib.h>
 5 #include<algorithm>
 6 using namespace std;
 7 int a[210];
 8 char c[210];
 9 double p[210],dp[210];
10 int main()
11 {
12     int i,j,n,kk=0;
13     while(scanf("%d",&n)!=EOF)
14     {
15         kk++;
16         for(i = 0; i <= n ; i++)
17         scanf("%d",&a[i]);
18         for(i = 1; i <= n ; i++)
19         cin>>c[i];
20         for(i = 1; i <= n ; i++)
21         scanf("%lf",&p[i]);
22         double ans=0;
23         for(i = 0; i <= 20 ; i++)
24         {
25             memset(dp,0,sizeof(dp));
26             if((a[0]&(1<<i))!=0)
27             dp[0] = 1;
28             for(j = 1; j <= n ;j++)
29             {
30                 dp[j] += p[j]*dp[j-1];
31                 if(c[j]=='^')
32                 {
33                     if((a[j]&(1<<i))!=0)
34                     dp[j]+=(1-dp[j-1])*(1-p[j]);
35                     else
36                     dp[j]+=dp[j-1]*(1-p[j]);
37                 }
38                 if(c[j]=='&')
39                 {
40                     if((a[j]&(1<<i))!=0)
41                     dp[j]+=dp[j-1]*(1-p[j]);
42                 }
43                 if(c[j]=='|')
44                 {
45                     if((a[j]&(1<<i))!=0)
46                     dp[j]+=(1-p[j]);
47                     else
48                     dp[j]+=dp[j-1]*(1-p[j]);
49                 }
50             }
51             ans+=(1<<i)*dp[n];
52         }
53         printf("Case %d:\n%.6f\n",kk,ans);
54     }
55     return 0;
56 }
View Code

 

posted @ 2013-08-17 21:35  _雨  阅读(187)  评论(0编辑  收藏  举报