写一个C语言程序实现给定标识符集(a 1 , a 2 , …a n ),这些字符的下标从1开始按自然序编号,p i 是对a i 成功检索的概率, q i 是不成功检索的概率, 且∑ (1<=i<=n) p i +∑ (0<=i<=n) q i =1,问:它的最优二分检索树是怎样的? 输入格式: 第1行是n,表示字符个数; 第2行是这n个字符的成功检索概率p i , 0<p i <1; 第3行是失败检索概率q i ,0<q i <1,且∑ (1<=i<=n) p i +∑ (0<=i<=n) q i =1。 输出格式: 最优二分检索树先根遍历时得到的字符编号序列。 输入样例1: 4 0.1875 0.1875 0.0625 0.0625 0.125 0.1875 0.0625 0.0625 0.0625 输出样例1: 2 1 3 4
时间: 2024-04-22 20:23:05 浏览: 151
C语言程序设计试卷A (3学分).doc
这是一道经典的动态规划问题,可以使用动态规划算法求解。具体思路如下:
定义 $w(i,j)$ 表示从$i$到$j$的权值和,$e(i,j)$ 表示最优的二叉树的期望搜索代价,$root(i,j)$ 表示从$i$到$j$的最优根结点。
对于一个区间 $[i,j]$ 中的每一个$k$,都可以将其作为根结点,然后计算期望搜索代价。
显然,$e(i,j)$ 的计算需要依赖 $w(i,j)$ 和 $e(i,k-1)$,$e(k+1,j)$ 以及 $p_k$ 和 $q_k$。因此,可以使用动态规划算法计算 $w$ 和 $e$。
具体实现时,可以先预处理出 $w$ 数组,然后根据 $w$ 数组求解 $e$ 和 $root$ 数组,最后根据 $root$ 数组输出序列。
C++代码如下:
阅读全文