2012-04-15 103 views
1

我們給出N個水果的集合F = {a1,a2,a3,...,aN}。每個水果的價格都是Pi和維生素含量Vi.Now我們必須按照這樣的方式安排這些水果,以便列表中的價格按升序排列,而列表中含有按降序排列的維生素。打印最大值列表

例如:: N = 4

裨:2 5 7 10

維:8 11 9 2

這是確切的問題https://cs.stackexchange.com/questions/1287/find-subsequence-of-maximal-length-simultaneously-satisfying-two-ordering-constr/1289#1289

回答

1

我想嘗試將問題減少到longest increasing subsequent problem

  1. 排序根據第一標準[維生素]
  2. 然後列表中,發現根據第二標準在修改列表中的最長遞增隨後, [價格]

該解決方案是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

+0

:我認爲它應該是最長的減少子序列。但是你上面的答案,例如2 – 2012-04-15 11:22:43

+0

@JohnGreve:看看編輯,我澄清了它。請注意,如果按'Vi'作爲主要標準[降序]排序,然後根據'Pi'查找增加的子序列,並且您正在尋找減少的子序列,則您正在尋找最長的子序列,反之亦然。 – amit 2012-04-15 13:51:01

+0

P.S.在這裏,我假設你想增加的子序列是嚴格增加的,否則結果是(13,100),(43,90),(78,65),(87,11),(87,10),(99, 10)' - 這是更長的子序列,但它並不嚴格按照「Pi」和「Vi」進行增減 – amit 2012-04-15 14:00:31