有什么更好的方法可以解决这个问题(贪心?)

时间:2019-03-07 08:34:56

标签: algorithm greedy

比方说,我有n个方框,每个方框内有一些值b[i]。我可以保证将一组数组排序为b[1] <= b[2] <= ... <= b[n]。我还可以保证有一个元素b[i] = x,并且我想找到x所在的框。要注意的是,打开每个框b[i]都需要花费c[i]

问题是如何最大程度地减少寻找x的总费用?我的直观方法是对b[i]进行二进制搜索。这减少了操作的总数(因为我得到了O(logn)比较),但是我无法确切地看到这将如何使总成本最小化。

很显然,仅选择最便宜的盒子并继续操作是行不通的,因为在最坏的情况下,我会打开每个盒子。关于如何改善这一点或如何证明自己的方法是最优/非最优的任何想法?

1 个答案:

答案 0 :(得分:0)

使用动态编程来找到最佳决策树。令T(i, j)为搜索位置i..j的最坏情况的代价。然后

T(i, j) = { 0,                                              if i > j;
          { min_{k=i}^j (c[k] + max(T(i, k-1), T(k+1, j))), otherwise.

记住每个间隔的最佳选择k

运行时间为O(n^3),使用Knuth的optimal BST技巧可将其减少到O(n^2)