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. HTTP请求&&响应

    在视频上截的图....俗话说好记性不如烂笔头,所以就保留下来 请求: 响应: 状态码: 请求头和响应头的解释:

  2. 漫谈linux文件IO

    在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...

  3. hdu 5611 Baby Ming and phone number(模拟)

    Problem Description Baby Ming collected lots of cell phone numbers, and he wants to sell them for mo ...

  4. poj 3669 Meteor Shower(bfs)

    Description Bessie hears that an extraordinary meteor shower is coming; reports say that these meteo ...

  5. Redis + Jedis + Spring (list操作)

    为了简便操作,我使用了StringRedisTemplate.用字符串操作做展示.当然,你可以继续使用RedisTemplate. 闲言少叙,上代码,一目了然: /** * Mar 5, 2013 * ...

  6. Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.3

    Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.3 http://blog.csdn.net/sunbow0 第二章Deep ...

  7. 初次使用SVN心得

    进入实验室, 一个项目往往需要多天多人次共同维护,所以版本控制也显得尤为关键.下面是我第一次使用SVN工具的心得体会. 首先是安装,服务器搭配方面应该是之前完成的,这里就不多讲了. 下载地址:http ...

  8. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...

  9. .net程序员转战android第三篇---登录模块之静态登录

    这一篇我将分2个部分记录登录界面,第一部分是静态登录, 这部分将如何从界面布局.控件使用.文件关系.数据验证.登陆实现等5小块记录. 第二部分是动态登录,这块会基于上面的4小块,在数据验证不是静态数据 ...

  10. SQL FOR XML PATH 用法

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...