最优二叉搜索树

给出一个数组,每个数字有一个出现平率。构造最优二叉搜索树,使得sum{元素的深度*元素的频率}(叫做二叉搜索树的权)最小。

本来是个经典O(n^3)的DP:

先把元素按照数组数字排序

f[i][j]=min(f[i][k-1]+f[k+1][j])+freq[i]+freq[i+1]+。。。+freq[j],i<=k<=j

freq[i]是第i个元素的频率。

不过存在一个神奇的O(n^2)做法,利用的是一个神奇的性质:

root[i][j-1]<=root[i][j]<=root[i+1][j]

root[i][j]表示从元素i到元素j的最优二叉搜索树的根, 可用dp来维护。

记忆化搜索的实现比较容易。

 

性质的证明还不知道……

复杂度的证明也不清楚

不过确实变快了不少

 

参考题目:

http://yzfy.org/dis/listpost.php?tid=888&pid=147078&page=9&extra=page%3D1#pid147078

你可能感兴趣的:(最优二叉搜索树)