HDU 4649 Professor Tian
Professor Tian
Total Submission(s): 376 Accepted Submission(s): 199
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).
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.
1 2 3
^ ^
0.1 0.2
2
8 9 10
^ ^
0.5 0.78
1
1 2
&
0.5
0.720000
Case 2:
4.940000
Case 3:
0.500000
贴一下解题报告的思路:
反状态压缩——把数据转换成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的更多相关文章
- HDU 4649 Professor Tian (概率DP)
Professor Tian Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- HDU 4649 Professor Tian(DP)
题目链接 暴力水过的,比赛的时候T了两次,优化一下初始化,终于水过了. #include <cstdio> #include <cstring> #include <st ...
- hdu 4649 Professor Tian 反状态压缩+概率DP
思路:反状态压缩——把数据转换成20位的01来进行运算 因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就 ...
- hdu 4649 Professor Tian 多校联合训练的题
这题起初没读懂题意,悲剧啊,然后看了题解写完就AC了 题意是给一个N,然后给N+1个整数 接着给N个操作符(只有三种操作 即 或 ,与 ,和异或 | & ^ )这样依次把操作符插入整 ...
- HDU 4649 Professor Tian(反状态压缩dp,概率)
本文出自 http://blog.csdn.net/shuangde800 题目链接:点击打开链接 题目大意 初始有一个数字A0, 然后给出A1,A2..An共n个数字,这n个数字每个数字分别有一 ...
- HDU 4649 - Professor Tian(2013MUTC5-1007)(概率)
不知道这题算作什么类型的题目,反正很巧妙,队友小杰想了没一会就搞定了 为了学习这种方法,我也搞了搞,其实思路不难想,位运算嘛,只有0和1,而且该位的运算只影响该位,最多20位,一位一位地计算即可,只需 ...
- HDU 4649 Professor Tian(概率DP)题解
题意:一个表达式,n + 1个数,n个操作,每个操作Oi和数Ai+1对应,给出每个操作Oi和数Ai+1消失的概率,给出最后表达式值得期望.只有| , ^,&三个位操作 思路:显然位操作只对当前 ...
- 【hdu 4696】Professor Tian
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=4649 [Description] 给你一个由位运算"与""或&quo ...
- HDU-4694 Professor Tian 概率DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4649 题意:给一个位运算的表达式,每个运算符和其后的运算数有一定概率不计算,求最后表达式的期望. 因为 ...
随机推荐
- java链接sqlite资料整理
0.SQLite三种JDBC驱动的区别 摘自http://blog.sina.com.cn/s/blog_654337ca01016x4n.html 在DBeaver中看到SQLite有三种JDBC驱 ...
- python之路-模块安装 paramiko
paramiko介绍(全是洋文,看不懂啊,赶紧有道翻译吧,等有朝一日,我去报个华尔街): "Paramiko" is a combination of the esperanto ...
- 仿桌面通知pnotify插件
在做网站的时候,alert弹出框是非常常见的情形.但是,有些情况下,弹框对用户来说是并不友好的.调研了几个其他的提示插件了,发现pnotify比较好用,可配置性也高. 使用示例: <!DOCTY ...
- 适用于CSS2的各种运动的javascript运动框架
<script> window.onload = function() { //var oDiv1 = document.getElementById('box1'); //var oDi ...
- Django中ModelForm应用
Django中ModelForm的应用 在传统中Form提交的POST的数据在服务器端获取时将不得不一一获取并验证数据的可靠性,但是使用django提供的Form时可简化该过程并提供相应的验证,同时D ...
- 解决ScrollView嵌套ListView和GridView冲突的方法
本文摘抄自:http://blog.csdn.net/yuhailong626/article/details/20639217 原文地址:http://blog.csdn.net/yuhailong ...
- 数据库对于null值的处理
对于null值的处理,不同的数据库的处理函数是不同的,这里列举了部分数据库对于null的处理函数以及使用: Oracle:是用函数nvl(), ----nvl(chinese,0);如果语文成绩为nu ...
- 在[self addsubView:xxx]中,self.name 和 _name的区别
在[self addsubView:xxx]中,self.name 和 _name的区别self.name 会调用重写的getter方法,而_name添加的只是_name 这个成员变量
- GridView+ZedGraph【转】
edgraph图表控件的强大功能令人出乎意料,与OWC相比我想应该毫不逊色,近来需求要求作出相关数据统计,不想使用BI这类的强大东西,所以搜索到 了免费的开源的Zedgraph控件.使用起来也非常方便 ...
- CDZSC_2015寒假新人(2)——数学 A
A - A Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...