hdu 4649 Professor Tian 多校第五场
2013-08-06 20:04
127 查看
状态压缩——把数据转换成20位的01来进行运算
因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就得到了总体的期望。
对于每一位,状态转移方程如下:
dp[i][j]表示该位取前i个数,运算得到j(0或1)的概率是多少。
dp[i][1]=dp[i][1]*p[i]+根据不同运算符和第i位的值运算得到1的概率。
dp[i][0]同理。
初始状态:dp[0][0~1]=0或1(根据第一个数的该位来设置)
每一位为1的期望 dp
[1]
因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就得到了总体的期望。
对于每一位,状态转移方程如下:
dp[i][j]表示该位取前i个数,运算得到j(0或1)的概率是多少。
dp[i][1]=dp[i][1]*p[i]+根据不同运算符和第i位的值运算得到1的概率。
dp[i][0]同理。
初始状态:dp[0][0~1]=0或1(根据第一个数的该位来设置)
每一位为1的期望 dp
[1]
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <iostream> #include <map> #include <vector> #include <algorithm> #include <set> using namespace std; #define clr(a, x) memset(a, x, sizeof(a)) #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define REP(i,a,b) for(int i=a;i<=b;i++) typedef __int64 lld; const int maxn = 220; int a[maxn]; char s[maxn][2]; double p[maxn]; double dp[21][2]; int main() { int n; int cas=1; while(~scanf("%d",&n)) { for(int i=0;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%s",s[i]); for(int i=1;i<=n;i++) scanf("%lf",&p[i]); memset(dp,0,sizeof(dp)); for(int i=0;i<=20;i++) { if(a[0]&(1<<i)) dp[i][1]=1; else dp[i][0]=1; } for(int i=1;i<=n;i++) { for(int j=0;j<=20;j++) { if(s[i][0]=='&') { if(a[i]&(1<<j)) {;} else { dp[j][0]=dp[j][0]+dp[j][1]*(1-p[i]); dp[j][1]=dp[j][1]*p[i]; } } if(s[i][0]=='^') { if(a[i]&(1<<j)) { double t0=dp[j][0]*p[i]+dp[j][1]*(1-p[i]); double t1=dp[j][0]*(1-p[i])+dp[j][1]*p[i]; dp[j][0]=t0; dp[j][1]=t1; } } if(s[i][0]=='|') { if(a[i]&(1<<j)) { dp[j][1]=dp[j][1]+dp[j][0]*(1-p[i]); dp[j][0]=dp[j][0]*p[i]; } } // printf("%.2lf ",dp[j][1]); } //puts(""); } double ans=0; for(int i=0;i<=20;i++) { ans+=(1<<i)*dp[i][1]; } printf("Case %d:\n%lf\n",cas++,ans); } return 0; }
相关文章推荐
- 2013 多校第五场 hdu 4649 Professor Tian
- HDU 4649 Professor Tian (2013多校联合5 1007)
- HDU 4649 多校第五场1007
- hdu 4649 Professor Tian 多校联合训练的题
- hdu 4649 Professor Tian 多校联合训练的题
- hdu 4651 Partition 多校第五场
- hdu - 4649 - Professor Tian(概率dp)
- (2017多校训练第五场)HDU - 6092 Rikka with Subset 0-1背包
- hdu 4649 Professor Tian
- hdu5790 Prefix(2016多校第五场1009)trie+主席树
- HDU 4649 Professor Tian
- HDU 4649 Professor Tian (概率DP)
- hdu 5344 MZL's xor (2015多校第五场第2题) 简单化简
- hdu 4920 Matrix multiplication 多校第五场 稀疏矩阵乘法
- hdu 4649 Professor Tian(期望)
- HDU 4649 Professor Tian
- HDU 4649 Professor Tian(反状态压缩dp,概率)
- HDU 4649 Professor Tian(概率DP)
- hdu 5349 MZL's simple problem (2015多校第五场第7题) multiset
- hdu 4649——Professor Tian