HDU 4649 Professor Tian (概率DP)
Professor Tian
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 870 Accepted Submission(s):
479
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 Oi with its
coming number Ai+1 may disappear, and the probability that it happens
is Pi (0<i<=n).
case, there is a integer n (0<n<=200) in the first line.In the second
line, there are n+1 integers, stand for {Ai}. The next line contains
n operators ,stand for {Oi}. The forth line contains {Pi}.
Ai will be less than 220,
0<=Pi<=1.
case in the first line.Then output the excepted value of the expression, round
to 6 decimal places.
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
题目大意
初始有一个数字A0, 然后给出A1,A2..An共n个数字,这n个数字每个数字分别有一个操作符,&,|,^
且每个数字出现的概率是pi
如果某个数字出现了,那么就和前面的数字用它的操作符进行位运算。
问最终的期望值是多少?
思路
这题官方题解说是反状态压缩,还是第一次做这种题。
知道了怎么表示状态这题就觉得不难做了,赛后1A。
题解官方的已经很详细了,不再累赘:
反状态压缩——把数据转换成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<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
using namespace std; typedef long long int64;
const int INF = 0x3f3f3f3f;
const int MAXN = ; int n, m;
double f[MAXN][];
int A[MAXN];
char O[MAXN];
double p[MAXN]; int main(){ char op[];
int cas = ;
while(~scanf("%d", &n)){ for(int i=; i<=n; ++i)
scanf("%d", &A[i]); for(int i=; i<=n; ++i){
scanf("%s", op);
O[i] = op[];
} for(int i=; i<=n; ++i)
scanf("%lf", &p[i]); for(int i=; i<; ++i)
f[][] = (A[i]>>i)&; double ans = ;
for(int i=; i<; ++i){
f[][] = (A[]>>i)&;
f[][] = !f[][]; for(int j=; j<=n; ++j){ // 第j个数字不出现,0和1的概率
f[j][] = f[j-][] * p[j];
f[j][] = f[j-][] * p[j]; // 加上出现第j个数字,0和1的概率
if(O[j] == '^'){
if( (A[j]>>i) & ){
f[j][] += f[j-][]*(-p[j]);
f[j][] += f[j-][]*(-p[j]);
} else{
f[j][] += f[j-][]*(-p[j]);
f[j][] += f[j-][]*(-p[j]);
} } else if(O[j] == '&'){
if( (A[j]>>i) & ){
f[j][] += f[j-][]*(-p[j]);
f[j][] += f[j-][]*(-p[j]);
} else{
f[j][] += (f[j-][] + f[j-][]) * (-p[j]);
// f[j][1]: 如果用了第j个数,这里不能出现1
}
} else if(O[j] == '|'){
if( (A[j]>>i) & ){
// f[j][0]: 不能出现这种情况
f[j][] += (f[j-][] + f[j-][]) * (-p[j]);
} else{
f[j][] += f[j-][] * (-p[j]);
f[j][] += f[j-][] * (-p[j]);
}
}
}
ans = ans + f[n][] * (<<i);
} printf("Case %d:\n%.6f\n", cas++, ans); }
return ;
}
HDU 4649 Professor Tian (概率DP)的更多相关文章
- HDU 4649 Professor Tian
Professor Tian Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- hdu 4649 Professor Tian 多校联合训练的题
这题起初没读懂题意,悲剧啊,然后看了题解写完就AC了 题意是给一个N,然后给N+1个整数 接着给N个操作符(只有三种操作 即 或 ,与 ,和异或 | & ^ )这样依次把操作符插入整 ...
- hdu 4649 Professor Tian 反状态压缩+概率DP
思路:反状态压缩——把数据转换成20位的01来进行运算 因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就 ...
- HDU 4649 Professor Tian(概率DP)题解
题意:一个表达式,n + 1个数,n个操作,每个操作Oi和数Ai+1对应,给出每个操作Oi和数Ai+1消失的概率,给出最后表达式值得期望.只有| , ^,&三个位操作 思路:显然位操作只对当前 ...
- HDU 4649 Professor Tian(反状态压缩dp,概率)
本文出自 http://blog.csdn.net/shuangde800 题目链接:点击打开链接 题目大意 初始有一个数字A0, 然后给出A1,A2..An共n个数字,这n个数字每个数字分别有一 ...
- HDU 4649 Professor Tian(DP)
题目链接 暴力水过的,比赛的时候T了两次,优化一下初始化,终于水过了. #include <cstdio> #include <cstring> #include <st ...
- HDU 4649 - Professor Tian(2013MUTC5-1007)(概率)
不知道这题算作什么类型的题目,反正很巧妙,队友小杰想了没一会就搞定了 为了学习这种方法,我也搞了搞,其实思路不难想,位运算嘛,只有0和1,而且该位的运算只影响该位,最多20位,一位一位地计算即可,只需 ...
- HDU-4694 Professor Tian 概率DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4649 题意:给一个位运算的表达式,每个运算符和其后的运算数有一定概率不计算,求最后表达式的期望. 因为 ...
- HDU 4089 Activation(概率DP)(转)
11年北京现场赛的题目.概率DP. 公式化简起来比较困难....而且就算结果做出来了,没有考虑特殊情况照样会WA到死的.... 去参加区域赛一定要考虑到各种情况. 像概率dp,公式推出来就很容易写 ...
随机推荐
- JZOJ| 5910. DuLiu
Description LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃圾题目者也,教人半懂不懂的.因为他姓李,别人便从QQ群上的“毒瘤李F ...
- python3 练习题100例 (十八)托儿所问题
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """练习十八:某托儿所有大.中.小三个班级,其儿童月龄分别用如下 三个列表 ...
- 17-比赛1 D - IPC Trainers (贪心 + 优先队列)
题目描述 本次印度编程训练营(Indian Programming Camp,IPC)共请到了 N 名教练.训练营的日程安排有 M 天,每天最多上一节课.第 i 名教练在第 Di 天到达,直到训练营结 ...
- P2344 奶牛抗议
P2344 奶牛抗议 题目背景 Generic Cow Protests, 2011 Feb 题目描述 约翰家的N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第i 位的奶牛的理智度为 ...
- [转]全图形PPT设计指南
三.什么时候使用 全图形PPT并不适用于所有时候,一般来说,我们在以下场合可以考虑使用:陈述一个故事.名人简介.产品介绍.读书笔记.心灵鸡汤.生活情趣等. 四.如何制作全图形PPT 全图形PPT的制作 ...
- 腾讯课堂之前端开发html5css3javascriptjQueryJS年薪20万
第一章 网页制作零基础 第一节 什么是HTML 第二节 HTML基本语法 第三节 HTML结构标签 第四节 HTML常用标签及属性 第五节 HTML无序列表UL标签 第六节 HTML定义列表DL标签 ...
- Pascal小游戏 双人射击
一个双人的游戏 Pascal源码附上 只要俩人不脑残,一下午玩不完...又是控制台游戏中的一朵奇葩. Free Pascal 射击游戏 Program shooting_game; uses crt; ...
- IE开发人员工具教程
写在前面 一直非常谷歌的控制台,因为我是做前端的,谷歌浏览器在我看来是解析JS最快的浏览器,所谓的熟能生巧,用熟悉了谷歌浏览器之后就特别喜欢用谷歌的控制台调试脚本.改变样式.查看HTML.查看资源加载 ...
- python的inspect模块
一.type and members 1. inspect.getmembers(object[, predicate]) 第二个参数通常可以根据需要调用如下16个方法: 返回值为object的所有成 ...
- ssh-centos74.sh
#!/bin/bash sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config sed -i 's/#Us ...