HDU 4649 Professor Tian(DP)
暴力水过的,比赛的时候T了两次,优化一下初始化,终于水过了。
1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 #define MOD 1000000007 7 #define LL __int64 8 double dp[2][1<<20]; 9 int que[1<<20]; 10 int flag[1<<20]; 11 double o[250]; 12 char str[250]; 13 int p[250]; 14 int judge(char s) 15 { 16 if(s == '^') 17 return 1; 18 else if(s == '&') 19 return 2; 20 else if(s == '|') 21 return 3; 22 return 1; 23 } 24 int main() 25 { 26 int n,cas = 1,i,j,x,t1,t2,num,tnum; 27 while(scanf("%d",&n)!=EOF) 28 { 29 scanf("%d",&x); 30 for(i = 1;i <= n;i ++) 31 scanf("%d%*c",&p[i]); 32 for(i = 1;i <= n;i ++) 33 scanf("%c%*c",&str[i]); 34 for(i = 1;i <= n;i ++) 35 scanf("%lf",&o[i]); 36 flag[x] = 1; 37 num = 1; 38 que[1] = x; 39 dp[0][x] = 1.0; 40 t1 = 0;t2 = 1; 41 for(i = 1;i <= n;i ++) 42 { 43 tnum = num; 44 for(j = 1;j <= num;j ++) 45 { 46 dp[t2][que[j]] += dp[t1][que[j]]*o[i]; 47 int temp,z = judge(str[i]); 48 if( z == 1) 49 { 50 temp = que[j]^p[i]; 51 if(!flag[temp]) 52 { 53 flag[temp] = 1; 54 que[++tnum] = temp; 55 } 56 dp[t2][temp] += dp[t1][que[j]]*(1.0-o[i]); 57 } 58 else if(z == 2) 59 { 60 temp = que[j]&p[i]; 61 if(!flag[temp]) 62 { 63 flag[temp] = 1; 64 que[++tnum] = temp; 65 } 66 dp[t2][temp] += dp[t1][que[j]]*(1.0-o[i]); 67 } 68 else 69 { 70 temp = que[j]|p[i]; 71 if(!flag[temp]) 72 { 73 flag[temp] = 1; 74 que[++tnum] = temp; 75 } 76 dp[t2][temp] += dp[t1][que[j]]*(1.0-o[i]); 77 } 78 } 79 num = tnum; 80 swap(t2,t1); 81 for(j = 1;j <= num;j ++) 82 dp[t2][que[j]] = 0.0; 83 } 84 double ans = 0; 85 for(i = 1;i <= num;i ++) 86 { 87 ans += que[i]*dp[t1][que[i]]; 88 flag[que[i]] = 0; 89 dp[t1][que[i]] = 0.0; 90 } 91 printf("Case %d:\n%.6f\n",cas++,ans); 92 } 93 return 0; 94 }