这是我的问题。我有一个整数的排序列表。我的目标是找到搜索最优二叉搜索树的最差成本。通过添加用于查找数字的每个节点的数量来计算成本。 (我们不添加号码)。
例如,4个第一个方块的OBST的最差成本如下:link to the illustration。 (N.B:叶子不计入费用) 最优树的最差成本是10。
我尝试了很多东西,但是我找不到一个好的算法(我需要最好的,但不能使用蛮力)。
long long maxRootLeafSum(const vector<long long>& v ){
long long sum = 0;
switch (v.size())
{
case 0:
sum = 0;
break;
case 1:
sum = 0;
break;
case 2:
sum = v[0];
break;
case 3:
sum = v[1];
break;
case 4:
sum = v[0] + v[2];
break;
default:
long long leftCost = 0, rightCost = v[v.size() - 2], i = 0, j = 0;
for (i = v.size() - 4; i >= j; i -= 2)
{
rightCost += v[i];
for (; leftCost < rightCost; ++j)
leftCost += v[j];
}
sum = min(leftCost, rightCost);
break;
}
return sum;
}
这可能适用于某些情况,但并非总是如此。我发现在4个节点下,我可以立即计算出结果。我相信可能有办法找到给定数据集的最佳根节点。如果是这样,我可以使用递归函数来找到最佳树的最差成本。也许我也完全没有走上正轨!
谢谢!