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 }