HDU 4649 Professor Tian(概率DP)题解

Posted kirinsb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4649 Professor Tian(概率DP)题解相关的知识,希望对你有一定的参考价值。

题意:一个表达式,n + 1个数,n个操作,每个操作Oi和数Ai+1对应,给出每个操作Oi和数Ai+1消失的概率,给出最后表达式值得期望。只有| , ^,&三个位操作

思路:显然位操作只对当前位相关,那么我们可以一位一位求解,算出每一位的概率,然后算出这一位所给出的贡献的期望。

代码:

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 200 + 10;
const int M = maxn * 30;
const ull seed = 131;
const int INF = 0x3f3f3f3f;
const int MOD = 1e4 + 7;
double dp[maxn][2], poss[maxn];
int a[maxn];
char op[maxn][2];
int main()
    int n, ca = 1;
    while(~scanf("%d", &n))
        for(int i = 0; i <= n; i++)
            scanf("%d", &a[i]);
        
        for(int i = 1; i <= n; i++)
            scanf("%s", op[i]);
        
        for(int i = 1; i <= n; i++)
            scanf("%lf", &poss[i]);
        
        for(int i = 0; i < 20; i++)
            if(a[0] & (1 << i))
                dp[i][1] = 1;
                dp[i][0] = 0;
            
            else
                dp[i][1] = 0;
                dp[i][0] = 1;
            
        
        double ans = 0;
        for(int k = 0; k < 20; k++)
            for(int i = 1; i <= n; i++)
                int bit = (1 << k) & a[i];
                double pre0 = dp[k][0], pre1 = dp[k][1];
                if(op[i][0] == &)
                    if(bit)
                        dp[k][1] = pre1;
                        dp[k][0] = pre0;
                    
                    else
                        dp[k][1] = pre1 * poss[i];
                        dp[k][0] = pre0 * (1 - poss[i]) + pre0 * poss[i] + pre1 * (1 - poss[i]);
                    
                
                else if(op[i][0] == |)
                    if(bit)
                        dp[k][1] = pre0 * (1 - poss[i]) + pre1;
                        dp[k][0] = pre0 * poss[i];
                    
                    else
                        dp[k][1] = pre1;
                        dp[k][0] = pre0;
                    
                
                else   // ^
                    if(bit)
                        dp[k][1] = pre1 * poss[i] + pre0 * (1 - poss[i]);
                        dp[k][0] = pre0 * poss[i] + pre1 * (1 - poss[i]);
                    
                    else
                        dp[k][1] = pre1;
                        dp[k][0] = pre0;
                    
                
            
//            printf("* %f %f\n", dp[k][0], dp[k][1]);
            ans += dp[k][1] * double(1 << k);
        
        printf("Case %d:\n%.6f\n", ca++, ans);
    
    return 0;

 

以上是关于HDU 4649 Professor Tian(概率DP)题解的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1052 Tian Ji -- The Horse Racing

HDU 1052 Tian Ji -- The Horse Racing

hdu1052 Tian Ji -- The Horse Racing---田忌赛马贪心

HDU 1052 Tian Ji -- The Horse Racing (贪心)

hdu acm-step 1.3.2 Tian Ji -- The Horse Racing

[HDU1052]Tian Ji -- The Horse Racing(田忌赛马)