题目大意:
给你n个点以及每个点的搜索频率,构建一个最优二叉树,使得二叉树的总权重最小,总权重等于每个点的搜索频率乘以其相应的深度的总和。设有3个点e1, e2, e3, 其搜索频率为f(e1), f(e2), f(e3), 若构建的二叉树中,其三个点在树中的深度分别为h1, h2, h3,则 W = f(e1) * h1 + f(e2) * h2 + f(e3) * h3。问题就是要求出最小的W。有点类似哈弗曼编码。
解题思路:
动态规划,每次状态都假设只有三个点,即根节点,左子树和右子树,遍历计算出每个节点作为根节点时的最小权重。
设 dp[L][H] 表示第 L 个节点到第 H 个节点构成最优二叉树的最小权重,则根节点遍历就是从 L 到 H 的范围内遍历。状态转移方程为:
ans = min( ans, dp[l][k-1] + dp[k+1][h] + sum[h] - sum[l-1] - v[k] );
方程中第 k 个节点为根节点,则dp[l][k-1] 表示从 l 到 k-1(即左子树)的最小权重, dp[k+1][h] 表示从 k+1 到h(即右子树)的最小权重,由于增加了一个根节点,则左右子树的深度都加 1 , 所以要加上 l 到 h 内所有节点的搜索频率,由于根节点的深度为0, 所以最后要减去第 k 个节点的搜索频率v[k]。
对于sum[h] 则表示从第 1 个节点到第 h 个节点的搜索频率总和,所以sum[h] - sum[l-1]表示 l 到 h 的所有节点的搜索频率总和。
代码:
#include <iostream> #include <cstring> #include <vector> using namespace std; #define MAX 260 int sum[MAX]; int dp[MAX][MAX]; int main() { int T, temp, h; while( cin>>T ) { vector<int> v; memset( dp, 0, sizeof( dp ) ); memset( sum, 0, sizeof( sum ) ); for( int i = 0; i < T; i++ ) { cin>>temp; v.push_back(temp); sum[i] = sum[(i==0?0:i-1)] + temp; } for( int num = 1; num <= v.size(); num++ ) //表示处理几个节点 { for( int l = 0; l + num < v.size(); l++ ) //l 表示处理的节点当中最小的那个节点, l + num 表示处理节点中最大的那个节点 { h = l + num; int ans = 99999; for( int k = l; k <= h; k++ ) //从 l 到 h 中遍历所有节点作为根节点 { ans = min( ans, dp[l][k-1] + dp[k+1][h] + sum[h] - sum[l-1] - v[k] ); } dp[l][h] = ans; } } cout<<dp[0][v.size()-1]<<endl; } return 0; }
相关推荐
### 最优二叉查找树(Optimal Binary Search Tree) #### 概述 最优二叉查找树(Optimal Binary Search Tree, OBST)是计算机科学领域内一种高效的搜索数据结构,其设计目标是在已知各节点访问概率的情况下,构建...
最小成本二分检索树optimal binary optimal binary
3. 最优二叉搜索树(Optimal Binary Search Tree): 最优二叉搜索树是相对于普通二叉搜索树的概念,它是指根据特定的权值分布(即不同节点被查找的概率),构造出平均查找成本最低的二叉搜索树。在最优二叉搜索树...
最优二叉搜索树(Optimal Binary Search Tree, OBST)是一种在二叉搜索树的基础上,通过优化节点的排列顺序以达到高效查找性能的数据结构。它不仅保持了二叉搜索树的特性,即左子节点的值小于根节点,右子节点的值...
**最优二叉搜索树(Optimal Binary Search Tree)** 最优二叉搜索树,又称为最优点缀树,是一种特殊的二叉查找树,它的每个结点都包含一个关键字,并且是有序排列的。这种树在搜索操作时能提供最小的平均查找时间。...
**最优二叉搜索树(Optimal Binary Search Tree)** 最优二叉搜索树,也被称为最优点搜索树,是一种特殊的二叉查找树,它的设计目的是为了在执行搜索操作时尽可能地减少平均查找时间。这种树的构造是基于给定的一组...
### 最优二叉检索树(Optimal Binary Search Tree) #### 概述 最优二叉检索树(Optimal Binary Search Tree, OBST),是一种特殊的二叉树结构,它旨在通过优化节点布局来降低查找数据时所需的平均成本。在构建...
最优二叉搜索树(Optimal Binary Search Tree, OBST)是在给定一组查询频率的情况下,设计的搜索效率最高的二叉搜索树。它的目标是最小化平均查找时间,这通常通过平衡树的高度和查询频率分布来实现。 创建最优二叉...
最优二叉搜索树(Optimal Binary Search Tree)是一种特殊的二叉搜索树,它的特性是对于每个节点,从根到该节点的所有路径上,其权值乘积最大。 二叉搜索树(Binary Search Tree,BST)是一种数据结构,其中每个...
在计算机科学中,最优二叉查找树(Optimal Binary Search Tree,简称OBST)是一种特殊的二叉查找树,其设计目标是在平均情况下提供最短的查找时间。与普通二叉查找树不同,最优二叉查找树的结构不是由插入顺序决定的...
最优二叉搜索树(Optimal Binary Search Tree)是在给定一组关键字和对应频率的情况下,构建的能最小化搜索成本的二叉搜索树。这种树的每个内部节点都是其左右子树的关键字频率之和的最大值。 AVL树是最早被提出的...
最优二叉查找树(Optimal Binary Search Tree, OBST)是一种高效的检索数据结构,它根据键值分布的不同,自适应地调整树的形态以达到最小化查找时间的目的。在计算机科学中,动态规划(Dynamic Programming, DP)是...
在这个文档包中,我们可以找到名为“Programming and Optimal Control2.pdf”的文件,这很可能是该领域的教材或研究资料。 动态规划(Dynamic Programming,DP)是由美国数学家理查德·贝尔曼提出的,它是一种将...
Optimal Control Theory - An Introduction.(Kirk D. Dover, 2004)Optimal Control Theory - An Introduction.(Kirk D. Dover, 2004)Optimal Control Theory - An Introduction.(Kirk D. Dover, 2004)
7.2 最优二分搜索树(Optimal Binary Search Tree) 最优二分搜索树是动态规划的一种应用,可以将一个有序数组分成两个部分,然后在每个部分中选择一个元素作为根节点,重複这个过程直到所有元素都被选择。这个问题...
This paper investigates the structures and properties of one-Lee weight codes and two-Lee weight projective codes over a"currency sign(4). The authors first give the Pless identities on the Lee weight...
首先,标题中提到的“Mathematical Theory of Optimal Processes”指的是优化过程的数学理论。这通常涉及到控制理论的一个分支,专门研究在给定某些约束条件下如何选择最优的控制策略来优化系统的性能指标。优化问题...