打印最大列表

时间:2012-04-15 10:59:37

标签: algorithm

我们给出了N个水果的集合F = {a1,a2,a3,...,aN}。每个水果都有价格Pi和维生素含量Vi。现在我们必须安排这些水果,使列表中的价格按升序排列,列表中的维生素按降序排列。

例如:: N = 4

Pi:2 5 7 10

Vi:8 11 9 2

这是确切的问题https://cs.stackexchange.com/questions/1287/find-subsequence-of-maximal-length-simultaneously-satisfying-two-ordering-constr/1289#1289

1 个答案:

答案 0 :(得分:1)

我会尝试将问题减少到longest increasing subsequent problem

  1. 根据第一个标准[维生素]
  2. 对列表进行排序
  3. 然后,在修改后的列表中找到最长的后续增加, 根据第二个标准[价格]
  4. 此解决方案为O(nlogn),因为步骤(1)和(2)均可在O(nlogn)中完成。
    Efficient Algorithms下查看维基百科文章 - 如何实现增长最快的后续

    修改

    如果您的列表允许重复,则在主要条件相同的情况下,您的排序[步骤(1)]必须按第二个参数排序作为次要标准。

    示例 [您的示例2]:

    Pi::99 12 34 10 87 19 90 43 13 78
    Vi::10 23 4 5 11 10 18 90 100 65
    

    在第1步之后,您会[在Vi为主要标准时进行排序,降序]:

    Pi:: 013 43 78 12 90 87 87 99 10 34
    Vi:: 100 90 65 23 18 11 10 10 05 04
    

    第二步找到Pi中增长最长的子序列,得到:

    (13,100), (43,90), (78,65), (87,11), (99,10)
    

    作为一种可行的解决方案,因为它是排序列表中[根据Pi]增加的子序列。

    P.S。在这里,我假设你想要的增加的子序列严格增加,否则结果是(13,100),(43,90),(78,65),(87,11),(87,10),(99,10) - 这是更长的子序列,但根据PiVi它没有严格增加/减少