当前位置: 首页 > news >正文

最优二叉搜索树【东北大学oj数据结构10-4】C++

题面

最优二叉搜索树是由 n 个键和 n+1 个虚拟键构造的二叉搜索树,以最小化搜索操作的成本期望值。
给定一个序列 K=k1​,k2​,...,kn​,其中 n 个不同的键按排序顺序 ,我们希望构造一个二叉搜索树。 对于每个关键 ki​,我们有一个概率 pi​,搜索将是ki​。 一些搜索可能针对不在 K 中的值,因此我们还有 n+1 个虚拟键 d0​,d1​,d2​,...,dn​ 表示不在 K 中的值。虚拟键 di​(0≤i≤n) 被定义 如下:

  • 如果 i=0,则 di​ 表示所有小于 k1​ 的值
  • 如果 i=n,则 di​表示所有大于 kn​ 的值。
  • 如果 1≤i≤n−1,则 di​表示 ki​ 和 ki+1​ 之间

对于每个虚拟键 di​,我们有一个搜索将对应于 di 的概率 qi。 对于 pi​(1≤i≤n) 和 qi​(0≤i≤n),我们有

那么在二叉搜索树 T 中搜索的期望成本是

其中depthT(v)是T中节点v的深度。对于给定的一组概率,我们的目标是构造一个期望搜索成本最小的二叉搜索树。 我们称这样的树为最优二叉搜索树。
每个密钥 ki 是一个内部节点,每个虚拟密钥 di 是一个叶子。 例如,下图显示了从样本输入 1 中得到的最优二叉搜索树。

任务
编写一个程序,计算通过给定 pi​ 获得的最优二叉搜索树上的搜索操作的期望值,搜索将针对 ki​ 和 qi​,搜索将对应于 di​。

输入

第一行,给出一个整数 n,表示键的数量。
第二行,pi​(1≤i≤n) 以具有四位小数的实数给出。
第三行,qi​(0≤i≤n) 以实数形式给出,小数点后四位。

1≤n≤500
0<pi​,qi​<1
∑i=1n​pi​+∑i=0n​qi​=1

输出

在一行中打印最优二叉搜索树上搜索操作的期望值。 输出误差不大于10^−4

输入样例

 5
0.1500 0.1000 0.0500 0.1000 0.2000
0.0500 0.1000 0.0500 0.0500 0.0500 0.1000

输出样例

2.75000000 

代码

 

#include <iostream>
#include <vector>
#include <iomanip>
#include <algorithm>using namespace std;const double MaxVal = 1e18;void optimalBST(double *p, double *q, int n, vector<vector<double>>& e, vector<vector<int>>& root, vector<vector<double>>& w) {// 初始化只包括虚拟键的子树for (int i = 1; i <= n + 1; ++i) {w[i][i - 1] = q[i - 1];e[i][i - 1] = q[i - 1];}// 由下到上,由左到右逐步计算for (int len = 1; len <= n; ++len) {for (int i = 1; i <= n - len + 1; ++i) {int j = i + len - 1;e[i][j] = MaxVal;w[i][j] = w[i][j - 1] + p[j] + q[j];// 求取最小代价的子树的根for (int k = i; k <= j; ++k) {double temp = e[i][k - 1] + e[k + 1][j] + w[i][j];if (temp < e[i][j]) {e[i][j] = temp;root[i][j] = k;}}}}
}int main() {int n;cin >> n;double* p = new double[n + 1];double* q = new double[n + 1];for (int i = 1; i <= n; ++i) {cin >> p[i];}for (int i = 0; i <= n; ++i) {cin >> q[i];}vector<vector<double>> e(n + 2, vector<double>(n + 2, 0.0));vector<vector<int>> root(n + 2, vector<int>(n + 2, 0));vector<vector<double>> w(n + 2, vector<double>(n + 2, 0.0));optimalBST(p, q, n, e, root, w);cout << fixed << setprecision(10) << e[1][n] << endl;delete[] p;delete[] q;return 0;
}

相关文章:

最优二叉搜索树【东北大学oj数据结构10-4】C++

题面 最优二叉搜索树是由 n 个键和 n1 个虚拟键构造的二叉搜索树&#xff0c;以最小化搜索操作的成本期望值。 给定一个序列 Kk1​,k2​,...,kn​&#xff0c;其中 n 个不同的键按排序顺序 &#xff0c;我们希望构造一个二叉搜索树。 对于每个关键 ki​&#xff0c;我们有一个…...

ESP32应用开发-Webserver

文章目录 库调用实例实现思路技术要点 1. 前端涉及的文件需要包装再发送2. http-GET路由3. http-POST路由 开发环境&#xff1a;Arduino 库调用 #include <WebServer.h> #include <ArduinoJson.h> //IDE没有自带&#xff0c;需自行安装实例 WebServer server…...

【IMU:视觉惯性SLAM系统】

视觉惯性SLAM系统简介 相机&#xff08;单目/双目/RGBD)与IMU结合起来就是视觉惯性&#xff0c;通常以单目/双目IMU为主。 IMU里面有个小芯片可以测量角速度与加速度&#xff0c;可分为6轴(6个自由度)和9轴&#xff08;9个自由度&#xff09;IMU&#xff0c;具体的关于IMU的介…...

前端开发 之 12个鼠标交互特效下【附完整源码】

前端开发 之 12个鼠标交互特效下【附完整源码】 文章目录 前端开发 之 12个鼠标交互特效下【附完整源码】七&#xff1a;粒子烟花绽放特效1.效果展示2.HTML完整代码 八&#xff1a;彩球释放特效1.效果展示2.HTML完整代码 九&#xff1a;雨滴掉落特效1.效果展示2.HTML完整代码 十…...

Unity文件路径访问总结:从基础到高级的资源加载方法

在Unity开发中&#xff0c;文件路径的访问和资源加载是开发者经常需要处理的任务。无论是加载纹理、模型、音频&#xff0c;还是读取配置文件&#xff0c;正确地处理路径和资源加载是确保项目顺利运行的关键。本文将以Unity文件路径访问为主线&#xff0c;详细介绍Unity中常见的…...

AWS Transfer 系列:简化文件传输与管理的云服务

在数字化转型的今天&#xff0c;企业对文件传输、存储和管理的需求日益增长。尤其是对于需要大量数据交换的行业&#xff0c;如何高效、可靠地传输数据成为了一大挑战。为了解决这一难题&#xff0c;AWS 提供了一系列的文件传输服务&#xff0c;统称为 AWS Transfer 系列。这些…...

Jenkins Api Token 访问问题

curl --location http://192.168.18.202:8080/view/ChinaFish/job/Ali/buildWithParameters?token1142be281174ee8fdf58773dedcef7ea4c&DeployTypeUpdateConfig \ --header Authorization: •••••• \ --header Cookie: JSESSIONID.824aa9a5node01ojk9yhh3imc24duwy67…...

垂起固定翼无人机大面积森林草原巡检技术详解

垂起固定翼无人机大面积森林草原巡检技术是一种高效、精准的监测手段&#xff0c;以下是对该技术的详细解析&#xff1a; 一、垂起固定翼无人机技术特点 垂起固定翼无人机结合了多旋翼和固定翼无人机的优点&#xff0c;具备垂直起降、飞行距离长、速度快、高度高等特点。这种无…...

【Leetcode 每日一题】1387. 将整数按权重排序

问题背景 我们将整数 x x x 的 权重 定义为按照下述规则将 x x x 变成 1 1 1 所需要的步数&#xff1a; 如果 x x x 是偶数&#xff0c;那么 x x / 2 x x / 2 xx/2。如果 x x x 是奇数&#xff0c;那么 x 3 x 1 x 3 \times x 1 x3x1。 比方说&#xff0c; x …...

科研笔记 KDD 2025

1 基本介绍 KDD 每年有多次投稿周期。KDD 2025 将有两个截止时间&#xff1a;分别是 2024 年 8 月 1 日和 2025 年 2 月 1 日&#xff08;全文提交截止时间在摘要提交截止后一周&#xff09;。 同时&#xff0c;KDD 会议论文集&#xff08;Proceedings&#xff09;将分两批出…...

黑马Java面试教程_P8_并发编程

系列博客目录 文章目录 系列博客目录前言1.线程的基础知识1.1 线程和进程的区别&#xff1f;难2频3面试文稿 1.2 并行和并发有什么区别&#xff1f; 难1频1面试文稿 1.3 创建线程的四种方式 难2频4面试文稿 1.4 runnable 和 callable 有什么区别 难2频3面试文稿 1.5 线程的 run…...

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&am…...

workman服务端开发模式-应用开发-后端api推送修改二

需要修改两个地方&#xff0c;第一个是总控制里面的续token延时&#xff0c;第二个是操作日志记录 一、总控续token延时方法 在根目录下app文件夹下controller文件夹下Base.php中修改isLoginAuth方法&#xff0c;具体代码如下&#xff1a; <?php /*** 总控制* User: 龙哥…...

SQL 使用带聚集函数的联结

聚集函数用于汇总数据&#xff0c;通常用于从一个表中计算统计信息&#xff0c;但也可以与联结一起使用。以下是一个例子&#xff0c;展示如何使用聚集函数统计每个顾客的订单数。 示例 1&#xff1a;使用 COUNT() 函数与 INNER JOIN 假设我们需要检索所有顾客及每个顾客所下…...

Restaurants WebAPI(三)——Serilog/FluenValidation

文章目录 项目地址一、Serilog使用1.1 安装 Serilog1.2 注册日志服务1.3 设置日志级别和详情1.4 配置到文件里1.5 给不同的环境配置日志1.5.1 配置appsettings.Development.json二、Swagger的使用三、自定义Exception中间件3.1 使用FluentValidation项目地址 教程作者:教程地址…...

概率论得学习和整理32: 用EXCEL描述正态分布,用δ求累计概率,以及已知概率求X的区间

目录 1 正态分布相关 2 正态分布的函数和曲线 2.1 正态分布的函数值&#xff0c;用norm.dist() 函数求 2.2 正态分布的pdf 和 cdf 2.3 正态分布的图形随着u 和 δ^2的变化 3 正态分布最重要的3δ原则 3.0 注意&#xff0c;这里说的概率一定是累计概率CDF&#xff0c;而…...

【原生js案例】让你的移动页面实现自定义的上拉加载和下拉刷新

目前很多前端UI都是自带有上拉加载和下拉刷新功能,按照官网配置去实现即可,比如原生小程序,vantUI等UI框架,都替我们实现了内部功能。 那如何自己来实现一个上拉加载和下拉刷新的功能? 实现效果 不用浏览器的css滚动条,自定义实现滚动效果 自定义实现滚动,添加上拉加载…...

【linux 常用命令】

1. 使用xshell 通过SSH连接到Linux服务器 ssh -p 端口号 usernameip地址2. 查看当前目录下的子文件夹的内存占用情况 du -a -h -d 1或者 du -ah -d 1-a &#xff1a;展示所有子文件夹&#xff08;包括隐藏文件夹&#xff09;&#xff0c;-h &#xff1a;以人类可读的形式&am…...

【JetPack】Room数据库笔记

Room数据库笔记 ORM框架&#xff1a;对齐数据库数据结构与面向对象数据结构之间的关系&#xff0c;使开发编程只考虑面向对象不需要考虑数据库的结构 Entity : 数据实体&#xff0c;对应数据库中的表 <完成面向对象与数据库表结构的映射> 注解&#xff1a; 类添加注解…...

【CSS in Depth 2 精译_088】第五部分:添加动效概述 + 第 15 章:CSS 过渡特效概述 + 15.1:状态间的由此及彼

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼 ✔️15.2 定时函数 文章目录 第 5 部分 添加动效 Adding motion第 15 章 过渡 Transitions15.1 状态间的由此及彼 From here…...

NaViL-9B开源模型生态:HuggingFace模型卡+GitHub训练代码指引

NaViL-9B开源模型生态&#xff1a;HuggingFace模型卡GitHub训练代码指引 1. 平台简介 NaViL-9B是上海人工智能实验室发布的一款原生多模态大语言模型&#xff0c;支持纯文本问答和图片理解双重能力。作为开源社区的重要贡献&#xff0c;该模型已在HuggingFace平台发布模型卡&…...

OpenClaw跨平台测试:Qwen3-VL:30B在Mac/Win/Linux飞书表现

OpenClaw跨平台测试&#xff1a;Qwen3-VL:30B在Mac/Win/Linux飞书表现 1. 测试背景与动机 去年12月接手团队自动化工具选型时&#xff0c;我们遇到了一个典型困境&#xff1a;团队成员分别使用macOS、Windows和Ubuntu系统&#xff0c;但现有AI助手工具要么绑定特定平台&#…...

ai辅助开发新思路:让快马kimi模型将ps“液化”滤镜创意变成网页动画

最近在做一个创意项目时&#xff0c;突然想到&#xff1a;如果能将PS里那个超好玩的"液化"滤镜效果搬到网页上&#xff0c;让用户直接通过鼠标拖拽就能实时扭曲图片&#xff0c;应该会很有趣。作为一个设计师转前端的跨界选手&#xff0c;我决定挑战一下这个想法。 理…...

nli-distilroberta-base实际作品:NLI服务返回JSON结构+置信度+可解释注意力图

NLI DistilRoBERTa Base实际作品&#xff1a;NLI服务返回JSON结构置信度可解释注意力图 1. 项目概述 基于DistilRoBERTa的自然语言推理(NLI)Web服务&#xff0c;能够智能分析两个句子之间的逻辑关系。这项技术可以广泛应用于问答系统、内容审核、智能客服等场景&#xff0c;帮…...

基于SpringBoot+Vue的AI智能客服系统开发实战:从H5输入到语言提问的完整实现

最近在做一个AI智能客服项目&#xff0c;客户要求既要能在H5页面里打字提问&#xff0c;又要能直接语音对话&#xff0c;后台还得有个清晰的管理界面。这听起来简单&#xff0c;但真做起来&#xff0c;从技术选型到具体实现&#xff0c;坑可真不少。今天就把这次从零到一搭建“…...

Janus-1.3B:1.3B参数解锁多模态理解生成新可能

Janus-1.3B&#xff1a;1.3B参数解锁多模态理解生成新可能 【免费下载链接】Janus-1.3B Janus-1.3B&#xff1a;新一代统一多模态模型&#xff0c;独特的自回归框架实现视觉编码解耦&#xff0c;提升多模态理解与生成的灵活性&#xff0c;性能超越传统模型。基于DeepSeek-LLM-1…...

智能邮件管家:OpenClaw+GLM-4.7-Flash自动化邮件处理系统

智能邮件管家&#xff1a;OpenClawGLM-4.7-Flash自动化邮件处理系统 1. 为什么需要自动化邮件处理 作为每天需要处理上百封邮件的商务人士&#xff0c;我发现自己陷入了"邮件黑洞"——早上打开邮箱就像打开潘多拉魔盒&#xff0c;重要客户询盘、会议邀请、账单通知…...

计算机毕业设计springboot校园信息聚合搜索平台 基于SpringBoot的高校信息整合检索系统 基于爬虫技术的校园资讯一站式服务平台

计算机毕业设计springboot校园信息聚合搜索平台58y0k2mm &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在数字化校园建设持续推进的背景下&#xff0c;高校内部各类信息资源呈爆…...

Java OOM 异常:从原理、场景、排查到解决方案全攻略

原理 → 场景 → 排查 → 解决方案&#xff08;面试 线上实战必备&#xff09;这是后端开发、测试、运维必须烂熟于心的终极 OOM 指南&#xff0c;结构清晰、可直接用于复习、面试、故障处理。一、OOM 基础&#xff1a;到底什么是 OOM&#xff1f;1. 定义OOM OutOfMemoryErro…...

ChatTTS长文本处理实战:AI辅助开发中的性能优化与避坑指南

最近在做一个AI辅助开发的项目&#xff0c;其中用到了ChatTTS来做文本转语音。功能本身挺酷的&#xff0c;但当我尝试处理一篇几千字的长文章时&#xff0c;问题就来了&#xff1a;程序直接卡死&#xff0c;或者内存占用飙升&#xff0c;生成的语音也断断续续的。这让我意识到&…...