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 }

 

你可能感兴趣的:(SSO)