针对一个包含不同(唯一)整数的数组,我想知道在所有排列中,右侧最长长度为k的二叉搜索树的数量。(如果k = 3,则root->right->right是叶节点)
(在我目前的要求下,我无法承受时间复杂度大于N^3的算法)
从不同的排列生成的两个相同的二叉搜索树被认为是不同的。
到目前为止,我的方法是:
假设有一个函数:
F(arr) = {a1, a2, a3...}
a1代表k=1的数组元素个数,a2代表k=2的数组元素个数,以此类推。
F(arr[1:n]) = 对于i从1到n的每个元素,计算(1 + df * F(子数组,其每个元素均大于arr[i] ) )
其中,df为动态因子,等于(n-1)C(小于arr[i]的元素个数)我正在尝试创建一个dp来解决这个问题:
- 对数组进行排序
- 从最大的数字开始向较小的数字进行迭代
- dp[i][i] = 1
- 对于j从i-1到1的所有元素,dp[j][i]是dp[j][i-1]的某个函数,但我无法确定这个函数
例如:对于数组{4, 3, 2, 1},我期望的dp结果如下:
arr[i] 4 3 2 1
+---+---+---+---+
k = 1 | 1 | 1 | 2 | 6 |
+---+---+---+---+
k = 2 | - | 1 | 3 |11 |
+---+---+---+---+
k = 3 | - | - | 1 | 6 |
+---+---+---+---+
k = 4 | - | - | - | 1 |
+---+---+---+---+
verification(n!) 1 2 6 24
任何提示、建议、指针或引导我满足好奇心的好源都欢迎。 谢谢。 编辑:看来我可能需要一个三维dp数组。我正在处理相同的问题。 编辑:修正了dp的第三列。