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. Java实现配置加载机制

    前言 现如今几乎大多数Java应用,例如我们耳熟能详的tomcat, struts2, netty…等等数都数不过来的软件,要满足通用性,都会提供配置文件供使用者定制功能. 甚至有一些例如Netty这 ...

  2. Linux usb子系统(三):通过usbfs操作设备的用户空间驱动

    内核中提供了USB设备文件系统(usbdevfs,Linux 2.6改为usbfs,即USB文件系统),它和/proc类似,都是动态产生的.通过在/etc/fstab文件中添加如下一行:none /p ...

  3. poj 2229 Sumsets(dp 或 数学)

    Description Farmer John commanded his cows to search . Here are the possible sets of numbers that su ...

  4. win下 git gui 使用教程

    现在很多都有git来托管项目或者来查找资料,但是看起来操作不是很方便,现在由于win下可以直接使用git gui,让使用git变得方便,当然这只是针对日常简单的使用,如果想详细的使用,可以去参考廖学峰 ...

  5. 线程:CyclicBarrier同步工具类

    一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点.比如公司组织活动出去玩,需要在公司门口一起搭车去.每个人从家里出发去公司门口,到达的时间肯定先后不一样,所以公司的车要一直等待,等所有人 ...

  6. javascript 获取event对象

    //转载处 http://www.cnblogs.com/funlake/archive/2009/04/07/1431238.html 非常详细 先从一个简单的例子说起,一个简单的button控件如 ...

  7. HTML5 Canvas 的事件处理---转

    DOM是Web前端领域非常重要的组成部分,不仅在处理HTML元素时会用到DOM,图形编程也同样会用到.比如SVG绘图,各种图形都是以DOM节点的形式插入到页面中,这就意味着可以使用DOM方法对图形进行 ...

  8. .Net Memory -- GC基本知识

    参考资料: http://blogs.msdn.com/b/tess/archive/2008/04/17/how-does-the-gc-work-and-what-are-the-sizes-of ...

  9. Oracle相关的知识点

    1. 如何在Oracle SQLPlus中执行SQL Script文件 以下面的格式在提示符中输入@{file name} SQL>@{file} 假设你要运行的文件的名字是script.sql ...

  10. OpenCV——Mat,IplImage,CvMat类型转换

    Mat,cvMat和IplImage这三种类型都可以代表和显示图像,三者区别如下 Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化. 而CvMat和IplImage类型更侧 ...