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 }

 

posted @ 2013-08-06 19:04  Naix_x  阅读(382)  评论(5编辑  收藏  举报