Professor Tian

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 376    Accepted Submission(s): 199


Problem Description
Timer took the Probability and Mathematical Statistics course in the 2012, But his bad attendance angered Professor Tian who is in charge of the course. Therefore, Professor Tian decided to let Timer face a hard probability problem, and announced that if he fail to slove the problem there would be no way for Timer to pass the final exam.

As a result , Timer passed.

Now, you, the bad guy, also angered the Professor Tian when September Ends. You have to faced the problem too. The problem comes that there is an expression and you should calculate the excepted value of it. And the operators it may contains are '&' (and),'|'(or) and '^'(xor) which are all bit operators. For example: 7&3=3, 5&2=0, 2|5=7, 4|10=14, 6^5=3, 3^4=7.

Professor Tian declares that each operator O
i with its coming number A
i+1 may disappear, and the probability that it happens is P
i (0<i<=n).

 
Input
The input contains several test cases. For each test case, there is a integer n (0<n<=200) in the first line.In the second line, there are n+1 integers, stand for {A
i}. The next line contains n operators ,stand for {O
i}. The forth line contains {P
i}.

A
i will be less than 2
20, 0<=P
i<=1.
 
Output
For each text case, you should print the number of text case in the first line.Then output the excepted value of the expression, round to 6 decimal places.

 
Sample Input
2
1 2 3
^ ^
0.1 0.2
2
8 9 10
^ ^
0.5 0.78
1
1 2
&
0.5
 
Sample Output
Case 1:
0.720000
Case 2:
4.940000
Case 3:
0.500000
 
Source
 
Recommend
zhuyuanchen520


 贴一下解题报告的思路:

反状态压缩——把数据转换成20位的01来进行运算

因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就得到了总体的期望。

对于每一位,状态转移方程如下:

f[i][j]表示该位取前i个数,运算得到j(0或1)的概率是多少。

f[i][1]=f[i-1][1]*p[i]+根据不同运算符和第i位的值运算得到1的概率。

f[i][0]同理。

初始状态:f[0][0~1]=0或1(根据第一个数的该位来设置)

每一位为1的期望 f[n][1]

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define N 250
using namespace std;
int num[N];
double p[N],dp[N][2];
char opr[N],s1[N];
int main()
{
//freopen("data.in","r",stdin);
int n,tem=1;
char c1,c2;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<=n;i++)
{
scanf("%d",&num[i]);
}
getchar();
gets(s1);
int l = strlen(s1);
for(int i=0,j=0;i<=l-1;i++)
{
if(s1[i]=='|'||s1[i]=='^'||s1[i]=='&')
{
opr[j] = s1[i];
j++;
}
}
for(int i=0;i<=n-1;i++)
{
scanf("%lf",&p[i]);
}
double ans=0.0;
for(int i=1;i<=20;i++)
{
int t=num[0]&1;
dp[0][t] = 1;
dp[0][(t+1)%2] = 0;
num[0]=(num[0]>>1);
for(int j=1;j<=n;j++)
{
int k = num[j]&1;
num[j]=(num[j]>>1);
char c = opr[j-1];
if(c=='|')
{
if(k==1)
{
dp[j][1] = dp[j-1][1]+dp[j-1][0]*(1-p[j-1]);
dp[j][0] = dp[j-1][0]*p[j-1];
}else
{
dp[j][1] = dp[j-1][1];
dp[j][0] = dp[j-1][0];
}
continue;
}else if(c=='&')
{
if(k==1)
{
dp[j][1] = dp[j-1][1];
dp[j][0] = dp[j-1][0];
}else
{
dp[j][1] = dp[j-1][1]*p[j-1];
dp[j][0] = dp[j-1][1]*(1-p[j-1])+dp[j-1][0];
}
continue;
}else if(c=='^')
{
if(k==1)
{
dp[j][1] = dp[j-1][0]*(1-p[j-1])+dp[j-1][1]*p[j-1];
dp[j][0] = dp[j-1][1]*(1-p[j-1])+dp[j-1][0]*p[j-1];
}else
{
dp[j][1] = dp[j-1][1];
dp[j][0] = dp[j-1][0];
}
continue;
}
}
ans += (1<<(i-1))*dp[n][1];
}
printf("Case %d:\n",tem++);
printf("%.6lf\n",ans);
}
return 0;
}

HDU 4649 Professor Tian的更多相关文章

  1. HDU 4649 Professor Tian (概率DP)

    Professor Tian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  2. HDU 4649 Professor Tian(DP)

    题目链接 暴力水过的,比赛的时候T了两次,优化一下初始化,终于水过了. #include <cstdio> #include <cstring> #include <st ...

  3. hdu 4649 Professor Tian 反状态压缩+概率DP

    思路:反状态压缩——把数据转换成20位的01来进行运算 因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就 ...

  4. hdu 4649 Professor Tian 多校联合训练的题

    这题起初没读懂题意,悲剧啊,然后看了题解写完就AC了 题意是给一个N,然后给N+1个整数 接着给N个操作符(只有三种操作  即  或 ,与 ,和异或 |   &  ^ )这样依次把操作符插入整 ...

  5. HDU 4649 Professor Tian(反状态压缩dp,概率)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:点击打开链接 题目大意 初始有一个数字A0, 然后给出A1,A2..An共n个数字,这n个数字每个数字分别有一 ...

  6. HDU 4649 - Professor Tian(2013MUTC5-1007)(概率)

    不知道这题算作什么类型的题目,反正很巧妙,队友小杰想了没一会就搞定了 为了学习这种方法,我也搞了搞,其实思路不难想,位运算嘛,只有0和1,而且该位的运算只影响该位,最多20位,一位一位地计算即可,只需 ...

  7. HDU 4649 Professor Tian(概率DP)题解

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

  8. 【hdu 4696】Professor Tian

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=4649 [Description] 给你一个由位运算"与""或&quo ...

  9. HDU-4694 Professor Tian 概率DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4649 题意:给一个位运算的表达式,每个运算符和其后的运算数有一定概率不计算,求最后表达式的期望. 因为 ...

随机推荐

  1. Html 加载音乐代码mp3

    <object data="__PUBLIC__/home/mp3/media.mp3" type="application/x-mplayer2" wi ...

  2. HDU 4362 Dragon Ball 线段树

    #include <cstdio> #include <cstring> #include <cmath> #include <queue> #incl ...

  3. configure交叉编译

    今天在交叉编译时犯了一个错误,纠结了好久,曾经交叉编译器的前缀基本上都是用arm-linux-,这次换了一个新环境是arm-none-linux-gnueabi-,于是想当然的把configure中的 ...

  4. js获取 input file 图片缩略图

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. Entity Framework Code First主外键关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  6. (原)ubuntu上安装dlib

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5652791.html 参考网址: http://stackoverflow.com/questions ...

  7. js跨浏览器事件处理

    var EventUtil = { addHandler: function(element,type,handler){ if(element.addEventListener){ element. ...

  8. php代码查询apache模块

    <?php print_r(apache_get_modules()); ?> 注:此函数仅适用于CGI模式.

  9. php 实现同一个账号同时只能一个人登录

    php 实现同一个账号同时只能一个人登录 张映 发表于 2015-01-22 分类目录: php 标签:mysql, nginx, openfire, php, redis 以前考虑过这个问题,今天实 ...

  10. 小希的迷宫(HDU 1272 并查集判断生成树)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...