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

2024-06-20 13:28

本文主要是介绍[动态规划位运算]表达式的期望值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

给定如下表达式:

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.chinasem.cn/article/1078255

相关文章

Python19 lambda表达式

在 Python 中,lambda 表达式是一个小型匿名函数,通常用于实现简单、单行的函数。lambda 函数可以接受任意数量的参数,但只能有一个表达式。 基本语法: lambda arguments: expression 这里,arguments 是传递给 lambda 的参数,expression 是关于这些参数的表达式,它的计算结果就是 lambda 函数的返回值。 使用

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项和细节 Servlet注

IPD推行成功的核心要素(十一)技术规划与平台规划促进公司战略成功

随着外部大环境的影响,各企业仅有良好的愿望是不够的。预测并顺应新兴市场和技术的变化,变危机为转机,不断推出强大的产品才是一个公司持续繁荣的根本保障。而高效的产品开发往往是基于某些关键技术,针对市场推出的一个或几个产品系列,这些产品系列通常共用一些产品平台,共用一种或者几种关键技术。当一家企业进入了平稳发展期,已经建立了较为完善的管理制度和产品开发流程,但是依然认为竞争对手是那样强大,那样不可战胜。

OSG学习:LOD、数据分页、动态调度

LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。在OSG的场景结点组织结构中,专门提供了场景结点osg::LOD来表达不同的细节层次模型。其中,osg::LOD结点作为父节点,每个子节点作为一个细节层次,设置不同的视域,在不同的视域下显示相应的子节点。 数据分页:在城市

Java代理-动态字节码生成代理的5种方式

上篇讲到了代理模式出现的原因,实现方式以及跟其他相似设计模式的区别。传送门@_@ http://blog.csdn.net/wonking666/article/details/79497547 1.静态代理的不足 设计模式里面的代理模式,代理类是需要手动去写的。但是手写代理的问题颇多 1.如果不同类型的目标对象需要执行同样一套代理的逻辑,比如说在方法调用前后打印参数和结果,那么仍然需要为每

鹅算法(GOOSE Algorithm,GOOSE)求解复杂城市地形下无人机避障三维航迹规划,可以修改障碍物及起始点(Matlab代码)

一、鹅算法 鹅优化算法(GOOSE Algorithm,GOOSE)从鹅的休息和觅食行为获得灵感,当鹅听到任何奇怪的声音或动作时,它们会发出响亮的声音来唤醒群中的个体,并保证它们的安全。 参考文献 [1]Hamad R K, Rashid T A. GOOSE algorithm: a powerful optimization tool for real-world engineering

自动驾驶规划中使用 OSQP 进行二次规划 代码原理详细解读

目录 1 问题描述 什么是稀疏矩阵 CSC 形式 QP Path Planning 问题 1. Cost function 1.1 The first term: 1.2 The second term: 1.3 The thrid term: 1.4 The forth term: 对 Qx''' 矩阵公式的验证 整体 Q 矩阵(就是 P 矩阵,二次项的权重矩阵)