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

 

你可能感兴趣的:(SSO)