hdu 4849 Professor Tian(dp)
2015-10-30 23:26
399 查看
题目链接:hdu 4849 Professor Tian
解题思路
将20位分开考虑,考虑最后为1的概率。代码
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn = 205; double P[maxn], dp[maxn][2]; int N, A[maxn]; char sig[maxn][2]; double solve (int bit, double s) { dp[0][0] = 1 - s, dp[0][1] = s; for (int i = 1; i <= N; i++) { for (int j = 0; j < 2; j++) dp[i][j] = dp[i-1][j] * P[i]; double p = 1 - P[i]; int v = (A[i]>>bit)&1; if (sig[i][0] == '&') { dp[i][v&0] += dp[i-1][0] * p; dp[i][v&1] += dp[i-1][1] * p; } else if (sig[i][0] == '|') { dp[i][v|0] += dp[i-1][0] * p; dp[i][v|1] += dp[i-1][1] * p; } else { dp[i][v^0] += dp[i-1][0] * p; dp[i][v^1] += dp[i-1][1] * p; } } return dp [1]; } int main () { int cas = 1, s; while (scanf("%d", &N) == 1) { scanf("%d", &s); for (int i = 1; i <= N; i++) scanf("%d", &A[i]); for (int i = 1; i <= N; i++) scanf("%s", sig[i]); for (int i = 1; i <= N; i++) scanf("%lf", &P[i]); double ans = 0; for (int i = 0; i <= 20; i++) ans += solve(i, (s>>i)&1) * (1<<i); printf("Case %d:\n%.6lf\n", cas++, ans); } return 0; }
相关文章推荐
- nodejs初学到express框架使用
- 前端布局革命史
- react 异步取数据
- 关于JS一些验证邮箱的一些问题
- 【错误笔记】undefined reference to `sqrt' collect2: ld returned 1 exit status
- AngularJs angular.forEach、angular.extend
- Javascript中this关键字详解
- js 基础
- LeetCode----Swap Nodes in Pairs
- JavaScript基本语法(第一
- 最短路径--Dijstra算法
- javascript入门基础
- Warning: curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when safe经过本人测试修改
- [置顶] Bootstrap导航栏实例讲解
- CSSS实现右侧定宽左侧自适应
- CSS背景
- Bootstrap:简洁、直观、强悍的前端开发框架
- js 传参数
- HTML标签之<q> <blockquote>
- js正则表达式