构造最优二叉查找树的动态规划算法

    首先,我们定义集合中的元素的查找概率是已知的(例如,从历史查找的统计数据中得出),这就很自然的引出了一个最优二叉树的问题。

假设a1,a2,.....an是从小到大排列互不相等的键,p1,p2........pn是他们的查找概率。C( i ,j )是在最优二叉树中成功查找的最小的平均查找次数,i,j 是整数下标, 1<= i <= j <=n。

废话不多说,直接上代码。

#include <string.h>
#include <stdio.h>
float  p[50]; //存放每个元素查找概率
//计算C(i , j)概率和函数
float sunP(int i , int j){
	int k ;
	float sum =0;
	for (k =i-1; k <= j-1 ; k++ )
	{
		sum+= p[k];
	}
	return sum;
}
//主函数
int main(){
	float  C[60][60] , minval = 100.0; //主表
	int R[60][60]; //根表
	int n , i , j , k , d;
	int  kmin ;
	scanf("%d",&n); //输入元素个数和对应的概率
	for (i = 0; i < n ; i++)
	{
		scanf("%f", &p[i]);
	}
	//初始化主表和根表数组
	memset(C, 0 , sizeof(C));
	memset(R, 0 , sizeof(R));
	for (i= 0; i <=n; i++)
	{
		if (i != n)
		{
			C[i][i+1] = p[i];
			R[i][i+1] = i+1;
		}
	}
 
	//对角线计数
	for (d = 1; d<n; d++)
	{
		for (i = 1; i <=n-d ; i++)
		{
			j = i+d;
			minval = 100.0;
			for (k = i; k <=j ; k++)
			{
				if((C[i-1][k-1] + C[k][j]) < minval){
					minval = C[i-1][k-1] + C[k][j];
					kmin = k;
				}
			}
			R[i-1][j] = kmin;
			C[i-1][j] = minval + sunP(i , j);
		}
	}
	//输出矩阵
	printf("\n");
	for (i = 0 ; i <=n ; i++ )
	{
		for (j = 0; j <=n ; j++)
		{
			printf("%.1f  ", C[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	for (i = 0 ; i <=n ; i++ )
	{
		for (j = 0; j <=n ; j++)
		{
			printf("%d  ", R[i][j]);
		}
		printf("\n");
	}
 
	return 0;
}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本科参加ACM竞赛的过程中积累下来的一部分算法模板,和自己在PKU上面做的一部分题目。 模板目录结构: 目录: 动态规划 O(n^2)的最长上升子序列 nlogn最长上升子序列 高精度 计算几何 Graham扫描 两线段交点 凸多边形面积 半平面交 计算几何库 数据结构 闭散列整数hash 开散列整数hash 字符串hash 堆 状数组 Trie 查找 线段 RMQ LCA+RMQ SB-Tree 数论 生成紧凑素数表 分解质因子 最大公约数 a^b mod n 扩张欧几里德算法 素数表质因子分解 Stirling公式 中国剩余定理 欧拉数(递推) 欧拉数(公式) 十进制转负进制 归并排序求逆序数 Pell方程 Catalan数,100以内 欧拉函数讲解 组合计数 组合数计算(double) 组合数计算(高精度) r-组合生成算法 r-排列生成算法 r-错位排列生成算法 图论 传递闭包 欧拉回路判定 有向图欧拉路径 分图最大匹配 匈牙利算法 分图最大匹配 HK算法 分图最大权匹配 KM算法 割边 强连通分量 缩点 Kosaraju算法 最大团 最小形图 无向图全局最小割 stoer-wagner O(n^3) 最短路径优先算法 SPFA 网络流 最大流:Ford&Fulkerson算法 最大流:Dinic算法 最大流:ek算法 最大流:dsp算法 最大流:hlpp算法 最小费用最大流:bellman_ford找增广路 最小费用最大流:ssp算法 字符串 KMP 通配符匹配 最小表示 后缀数组 倍增算法 基于多串匹配的有限状态自动机 未分类 归并排序 星期几的计算 N皇后构造 几个常用的位操作 最大最小定理总结 0/1分数规划总结 (by yxysdcl 2008/11/19) 代码目录结构: 目录: 动态规划 钉子和小球 Hash+dp分词(摩尔电码) 火柴棒等式 DAG图DP,老鼠打洞 最短子路径 最少回文数 矩阵链乘 形DP 最少的石子填到根节点 种删除最少的边使刚好剩下P个点 的支配集 最优连通子集 带背包的形DP 最小顶点覆盖,判唯一 用最少的点覆盖所有的边 DAG上的记忆化形DP,博弈 有限状态自动机+形DP 状态压缩DP 炮兵阵地 Help Bob,买匹萨 匹配数量 堆筛子 全排列式状态DP 计算几何 多边形地图染色 数据结构 Hash 枚举+hash,方程解数 点集对称中心 字符hash,统计出现最多的单词 类此The Happy worm 数据结构 状数组 覆盖某区间数量统计 Cows Stars 两个桩数组 状数组 数据结构 双端队列 Sliding Window 数据结构 线段 Cows 线段染色 排队问题 第K大的数 离散化+线段 灯光投影 网络赛取连续子序列问题 线段+状数组+并查集,转化为排队问题 离散化 离散化矩形切割,矩形覆盖面积统计 覆盖矩形周长统计 离散化矩形切割 灯光投影 搜索 导弹 Bfs+hash状态的抽象,模关系 Bfs变形,钥匙与门 双向广搜 迭代加深 优先队列搜索,过最少的门救人,建图 A*搜索 图论 差分约束 Intervals bellman_ford Intervals SPFA 出纳员的雇佣 不等式组 图论 割边 图染色 拓扑 欧拉路径) 割点+统计删除后剩下多少连通图 删除一个点使得连通分量最多 图染色 拓扑排序全部序列 最大生成 有向图欧拉路径 字典序最小的有向图欧拉路径 图论 匹配 完美匹配FBI Koning定理,泥地 分图最大独立集 通讯站天线覆盖 分图拆分后匹配 分图某边唯一匹配 最小权匹配 海上矿工 floyd预处理 最大权匹配,需要非完全图转完全图 传递闭包+最小路径覆盖 可以重复经过点 图论 网络流 Adding-the-maximum-flow arc 增量网络流 区间枚举,猴子语言+网络流 最小费用最大流 最大流最小割定理 摧毁伞兵 最大流最小割定理 泥地 图论 最短路径 Dijkstra+heap 昂贵的聘礼 最短路变形 中任意点对最短路和 Bellman_ford 货率 限制长度最短路,负环判连通,点权变边权,改变正负号 表达式求值 算法优先算法求表达式的值 词分析与算法优先算法,集合运算:差集,并集,交集 矩阵乘 线段覆盖数量 矩阵构造,nlogn矩阵乘 2-SAT XOR

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值