[动态规划位运算]表达式的期望值

描述

给定如下表达式:

A0O1A1O2A2O3A3… OnAn

其中Ai(0<=i<=n)代表操作数,Oi(1<=i<=n)代表算子。有三类算子包括‘&’、‘|’和‘^’,这些算子拥有相同的计算优先级。每个算子Oi以及它后面相邻的操作数Ai,他们可能一起消失,消失的概率为Pi(注意为保证计算精度须使用double型数据)。

例如,对于样例输入中的第一组测试数据期望计算方法为:

(P1*P2)*A0+(1-P1)*(P2)*(A0O1 A1)+(P1)*(1-P2)*(A0O2A2)+(1-P1)*(1-P2)*( A0O1A1O2A2)=0.1*0.2*1+0.9*0.2*(1^2)+0.1*0.8*(1^3)+0.9*0.8*(1^2^3)=0.72

输入

输入包含若干测试样例。
对于每组测试样例,第一行为正整数n ( 0 < n <= 200 )
第二行包含n+1个正整数代表操作数集合{A}(其中Ai小于2^20),
第三行包含n个算子代表操作算子集合{O},第四行包含n个浮点数代表概率集合{P}(其中0 <= Pi <= 1)。

输出

对于每组测试样例,第一行输出测试样例序号(从1开始)。然后,输出期望值,近似到小数点后6位。

样例输入

2 
1 2 3 
^ ^ 
0.1 0.2 
2 
8 9 10 
^ ^ 
0.5 0.78
1 
1 2 
& 
0.5

样例输出

Case 1: 
0.720000 
Case 2: 
4.940000 
Case 3: 
0.500000
解题分析

首先,稍稍分析一下题目的运算的数量级,我们可以发现2^200是一个非常大的数,所以直接排除枚举法。那还有啥办法呢?我们注意到,在这里的每一个运算都是位运算,而位运算有一个很有意思的特点就是位间独立性,而且题目不是也提示了吗,每个数不超过2^20,所以我们只要考虑这20位就可以了!那么,问题就变成了一堆0,1序列了,我们不妨设每个数的二进制表示的第i位为ai,那么我们不妨先考虑一下只有0,1两个值的一个分布列,那么期望就是为1的概率。回到这个问题上来,其实我们可以考虑一下它们直接的递推关系,设Xk为到第k个数时,整个序列的期望,那么,由于结果只有0和1,为他们两个的二值分布,所以实际上Xk=表达式的值为1的概率。那么,显然有,当第k+1个数的运算符和数字都被吃掉的时候,有prob[k+1]的概率,这个时候,Xk+1的值就是Xk,第二种情况就是,运算符没有被吃掉,那么分别分为三种情况讨论,我们用一个calculate函数去表示,Xk+1=prob[k+1]*Xk+(1-prob[k+1])*Xk+1; 此处的Xk+1可以定义为calculate(E,ops[k+1],(nums[k+1]>>i)&1)。 注意,calculate函数返回的也是一个概率(或者说期望),即Xk+1。有时候最后一个数字可以决定整个表达式的值,比如肯定为1或者肯定为0这样子。最后我们把每一位乘上相应的2的某个次方相加即可。

代码实现
#include <iostream>
#include <cmath>
//#include <iomanip>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <list>
#include <bitset>
#include <queue>
#include <stack>
#include <cstdlib>
using namespace std;int nums[205];char ops[205];double probs[205];double calculate(double l,char op,double r){if(op=='&'){return r?l:0;}else if(op=='|'){return r?1:l;}else if(op=='^'){return r?1-l:l;}return 0;
}int main(){int n,t=0;while(scanf("%d",&n)!=EOF){t++;printf("Case %d:\n",t);double res=0;for(int i=0;i<=n;i++){scanf("%d",&nums[i]);}for(int i=1;i<=n;i++){scanf(" %c",&ops[i]);}for(int i=1;i<=n;i++){scanf("%lf",&probs[i]);}for(int i=0;i<=20;i++){double E=(double)((nums[0]>>i) & 1);for(int j=1;j<=n;j++){E=probs[j]*E+(1-probs[j])*calculate(E,ops[j],(nums[j]>>i) & 1);}res += E * (double)(1<<i);}printf("%.6lf\n",res);}return 0;
}

这个做法非常巧妙,这里也很感谢一个学长or学姐提供的原理做法,这道题还是蛮有难度的!

@

逸修竹榭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDK8和JDK17共存以及切换

1. 下载和安装 1.1下载安装JDK17 下载地址: https://www.oracle.com/cn/java/technologies/downloads/ 1.2安装jdk17 点击下一步 此处可以修改安装的目标位置,修改安装位置后,点击下一步 接下来及安装完成 注意事项 此时通过cmd命令java –version你会发现竟然出现了…

四十八、openlayers地图调色总结——锐化、模糊、浮雕滤镜,调整地图色相、饱和度、亮度

这篇是对滤镜的总结&#xff0c;方便工作中直接使用。 想要调整图层的颜色&#xff0c;有两种方法。 方法一&#xff1a; 加载图层时使用tileLoadFunction函数拿到context添加canvas滤镜效果。 this.imagery new TileLayer({source: new XYZ({url: "https://server.arc…

MeshAnything:艺术家级别的自回归3D网格生成

MeshAnything: Artist-Created Mesh Generation with Autoregressive Transformers &#x1f4dc; 文献卡 MeshAnything: Artist-Created Mesh Generation with Autoregressive Transformers作者: Yiwen Chen; Tong He; Di Huang; Weicai Ye; Sijin Chen; Jiaxiang Tang; Xin…

二进制部署Prometheus

在监控里面Prometheus现在用的还是比较多的&#xff0c;一般我们都是在Kubernetes环境里面部署&#xff0c;然后监控咱们的容器化环境&#xff0c;今天给大家分享一些不一样的&#xff0c;使用二进制的方式在机器上直接部署&#xff0c;并且监控机器上的进程。 说到监控大家通常…

普陀食材配送沪鑫餐饮专业化、标准化、现代化新篇章

在上海普陀这片繁华的土地上&#xff0c;企事业单位如繁星点点&#xff0c;它们不仅推动了区域经济的飞速发展&#xff0c;更在员工福利待遇上不断追求卓越。其中&#xff0c;食材配送作为后勤管理的重要环节&#xff0c;正迎来专业化、标准化、现代化的新篇章。 提及普陀食材配…

短视频开源项目MoneyPrinterTurbo:AI副业搞起来,视频制作更轻松!

目录 引言一、MoneyPrinterTurbo简介二、MoneyPrinterTurbo的核心功能三、MoneyPrinterTurbo的未来发展四、MoneyPrinterTurbo与AI副业五、部署实践1、克隆代码2、创建虚拟环境3、安装依赖4、安装好 ImageMagick5、端口映射6、启动Web界面7、模型配置8、填写主题9、视频生成10、…

OpenSSL 生成 RSA 公钥和私钥

sudo apt-get update sudo apt-get install openssl、 生成私钥 openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048 提取公钥 openssl rsa -pubout -in private.pem -out public.pem cat public.pem 将文件导出就行

使用事件日志识别常见 Windows 错误

事件查看器&#xff0c;一个标准的诊断工具&#xff0c;嵌入在Windows操作系统&#xff0c;记录了所有的系统事件&#xff0c;该日志捕获有关硬件问题、软件中断和整体系统行为的详细信息。通过分析这些日志&#xff0c;管理员可以查明系统错误和运行时错误的根本原因。了解如何…

达索系统 PLM:引领创新的数字化解决方案

在当今竞争激烈的商业环境中&#xff0c;企业需要不断提升创新能力和运营效率&#xff0c;以应对快速变化的市场需求。产品生命周期管理&#xff08;PLM&#xff09;系统作为一种综合性的数字化解决方案&#xff0c;正逐渐成为企业实现可持续发展的关键。而达索系统的 PLM 则以…

OpenCV--图像的运算

图像的运算 代码和笔记 代码和笔记 import cv2 import numpy as np""" 图像的运算 """# 读取图片 cat1 cv2.imread(./img/cat.jpeg) cat2 cv2.imread(./img/cat.jpeg)""" 加减乘除 """ # 加法(有点杂交的感觉)…

MySQL的字符集与排序规则

在MySQL数据库中&#xff0c;字符集&#xff08;Character Set&#xff09;和排序规则&#xff08;Collation&#xff09;是两个至关重要的概念&#xff0c;它们共同决定了数据库中字符数据的存储、比较和排序方式。对于涉及多语言、国际化或特殊字符处理的应用来说&#xff0c…

56岁张卫健前任貌突然回春大进化?自曝婚礼前夕流产

现年56岁的江欣燕于1985年以18岁之龄参加第4届新秀歌唱大赛入行&#xff0c;曾拍过多部无线经典电视剧&#xff0c;包括《娱乐插班生》、《同事三分亲》及《女人俱乐部》等。现时甚少作幕前演出的江欣燕日前在社交平台上载分享了新短片&#xff0c;当中更以Deep V上阵&#xff…

大数据集群搭建基础:Hadoop完全分布式搭建学习指南!!

Hadoop完全分布式搭建学习指南 Hadoop版本&#xff1a;Hadoop2.X JDK版本&#xff1a;JDK1.8一、准备工作 设置主机名和IP 在三台CentOS 7.4机器上分别设置主机名和IP&#xff1a; node1: 192.168.14.10node2: 192.168.14.20node3: 192.168.14.30 修改主机名&#xff08;以nod…

从 0 打造私有知识库 RAG Benchmark 完整实践

背景介绍 最近从 0 构建了一个大模型知识库 RAG 服务的自动化 Benchmark 评估服务&#xff0c;可以基于私有知识库对 RAG 服务进行批量自动化测试与评估。本文是对这个过程的详细记录。 本文实际构建的是医疗行业知识库&#xff0c;基于高质量的医学指南和专家共识进行构建。…

前端从视频文件提取画面帧

extractFramesFromVideo方法提取画面帧 // 设定一个异步函数&#xff0c;输入参数为&#xff1a; // videoUrl&#xff08;需要提取画面帧的视频的URL&#xff09; // fps&#xff08;每秒帧率&#xff0c;默认为25帧&#xff09; async function extractFramesFromVideo(vide…

Linux中MySQL的相关配置及命令(Ubuntu22.04)

安装 MySQL apt install mysql-server apt install mysql-client相关配置文件 默认配置文件地址: /etc/mysql/mysql.conf.d 基础配置如下 # 基础配置 [mysqld] # # * Basic Settings # user mysql pid-file /var/run/mysqld/mysqld.pid socket /var/run/mysqld/mysqld.…

uni-app地图组件控制

uni.createMapContext(mapId,this) 创建并返回 map 上下文 mapContext 对象。在自定义组件下&#xff0c;第二个参数传入组件实例this&#xff0c;以操作组件内 <map> 组件。 注意&#xff1a;uni.createMapContext(mapId, this) app-nvue 平台 2.2.5 支持 uni.create…

DataWorks Copilot:大模型时代数据开发的新范式

导读 DataWorks 是阿里云一站式智能化数据开发与治理平台&#xff0c;支持搭配MaxCompute/Hologres/AnalyticDB/StarRocks/EMR/CDH 等大数据引擎&#xff0c;为企业构建数据仓库、数据湖以及湖仓一体&#xff08;Lakehouse&#xff09;现代数据架构提供数据平台产品解决方案。…

推荐一款功能强大的显示器!

最近在写项目开发文档&#xff0c;经常需要几个界面来回切换&#xff0c;真的深刻感受到了一台外接显示器对一名程序员来说有多重要了&#xff0c;画功能流程图的时候嫌弃自己的笔记本屏幕不够大&#xff0c;看代码的时候又在想要是有个旋转屏就好了&#xff0c;来回切换界面的…

C实时导航

导航算法怎么改成实时的&#xff1f; 将导航算法改为实时运行需要考虑几个关键因素&#xff0c;包括数据源的实时性、算法的计算效率、以及与外部硬件&#xff08;如传感器、执行器等&#xff09;的实时交互。由于MATLAB不是用于实时系统的首选工具&#xff08;尽管它有一些实时…