HDU 4649 多校第五场1007
来源:互联网 发布:漳州卓知职业培训学校 编辑:程序博客网 时间:2024/05/16 07:53
虽然这次做了5题,但是居然还是有板刷题没过掉。。
又是这节奏。。
贴一下这道板刷题。。
思路:每个数取他的二进制位,对于每一位,我们求他最后出现1的概率,那么最后的期望就是为1的概率乘以该位的十进制数,累加即可。
想到状压就是水题。。。
#include <iostream>#include <cstdio>#include <algorithm>#include <string>#include <cmath>#include <cstring>#include <queue>#include <set>#include <vector>#include <stack>#include <map>#include <iomanip>#define PI acos(-1.0)#define Max 2505#define inf 0x7fffffff#define LL(x) ( x << 1 )#define RR(x) ( x << 1 | 1 )#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )#define ll long long#define mem(a,b) memset(a,b,sizeof(a))#define mp(a,b) make_pair(a,b)#define PII pair<int,int>#define bug puts("here")using namespace std;#define N 222double dp[22][N][2] ;//第i位第j个数是k的概率。int a[N] ;char b[N] ;double p[N] ;int n ;int main() { int ca = 0 ; while(cin >> n){ for (int i = 0 ; i <= n ; i ++ ){ scanf("%d",&a[i]) ; } for (int i = 1 ; i <= n ; i ++ ){ cin >> b[i] ; } for (int i = 1 ; i <= n ; i ++ ){ cin >> p[i] ; } for (int i = 0 ; i <= n ; i ++ ){ for (int j = 0 ; j <= 20 ; j++ ){ for (int k = 0 ;k < 2 ; k ++ ) dp[j][i][k] = 0 ; } } double ans = 0 ; for (int i = 0 ; i <= 20 ; i ++ ){ if(a[0] & (1 << i)) dp[i][0][1] = 1 ; else dp[i][0][0] = 1 ; for (int j = 1 ; j <= n ; j ++ ){ dp[i][j][1] = dp[i][j - 1][1] * p[j] ;//该位不取 dp[i][j][0] = dp[i][j - 1][0] * p[j] ;//该位不取 if(a[j] & (1 << i)){//取该位 if(b[j] == '&'){ dp[i][j][1] += dp[i][j - 1][1] * (1 - p[j]) ; dp[i][j][0] += dp[i][j - 1][0] * (1 - p[j]) ; } else if(b[j] == '|'){ dp[i][j][1] += dp[i][j - 1][1] * (1 - p[j]) ; dp[i][j][1] += dp[i][j - 1][0] * (1 - p[j]) ; } else { dp[i][j][1] += dp[i][j - 1][0] * (1 - p[j]) ; dp[i][j][0] += dp[i][j - 1][1] * (1 - p[j]) ; } } else {//同理 if(b[j] == '&'){ dp[i][j][0] += dp[i][j - 1][1] * (1 - p[j]) ; dp[i][j][0] += dp[i][j - 1][0] * (1 - p[j]) ; } else if(b[j] == '|'){ dp[i][j][1] += dp[i][j - 1][1] * (1 - p[j]) ; dp[i][j][0] += dp[i][j - 1][0] * (1 - p[j]) ; } else { dp[i][j][0] += dp[i][j - 1][0] * (1 - p[j]) ; dp[i][j][1] += dp[i][j - 1][1] * (1 - p[j]) ; } } } ans += (1 << i) * dp[i][n][1] ; } printf("Case %d:\n%.6f\n",++ca ,ans) ; } return 0 ;}
- HDU 4649 多校第五场1007
- hdu 4649 Professor Tian 多校第五场
- 2013 多校第五场 hdu 4649 Professor Tian
- hdu 4651 Partition 多校第五场
- 多校第五场
- hdu 4647 Another Graph Game 多校第五场
- 2013 多校第五场 hdu 4651 Partition
- 2013 多校第五场 hdu 4648 Magic Pen 6
- 2013 多校第五场 hdu 4647 Another Graph Game
- hdu 4915 Parenthese sequence 多校第五场
- hdu 4920 Matrix multiplication 2014多校第五场1010
- hdu 4911 Inversion 多校第五场 求逆序数
- 2016多校第五场 1001 HDU 5781 DP
- hdu 5791 two 多校联赛第五场
- 概率DP_____ATM Mechine( hdu 5781 2016多校第五场)
- hdu 5349 MZL's simple problem(15多校第五场1007)
- (2017多校训练第五场)HDU
- 多校联赛第五场
- [leetcode刷题系列]Rotate List
- Java web 过滤器
- Jquery入门指导
- Unix原理与应用(第四版)学习笔记2--系统调用之文件篇
- HDOJ 1013 Digital Roots
- HDU 4649 多校第五场1007
- NYOJ 139 我排第几个
- 使用SQL语句创建和删除约束
- linux make menuconfig\Makefile\Kconfig 详解
- telnet 连接不上本机解决方案
- Java Basic2
- python3语法变动 及新特性
- Python 字典结构遍历
- 通配符