2つの順序付け制約を同時に満たす最大長の部分列を見つける


8

我々は、セット与えられるの果実を。各フルーツには価格とビタミン含有量ます。果物を順序付けられたペアに関連付けました。次に、ソートされたリストに価格が昇順で、ビタミン含有量が降順で含まれるように、これらの果物を配置する必要があります。F={f1,f2,f3,,fN}NPiVifi(Pi,Vi)

例1:および。N=4F={(2,8),(5,11),(7,9),(10,2)}

すべての価格が昇順で、ビタミン含有量が降順であるようにリストを配置すると、有効なリストは次のようになります。

  • [(2,8)]
  • [(5,11)]
  • [(7,9)]
  • [(10,2)]
  • [(2,8),(10,2)]
  • [(5,11),(7,9)]
  • [(5,11),(10,2)]
  • [(7,9),(10,2)]
  • [(5,11),(7,9),(10,2)]

上記のリストから、最大サイズのリストを選択したいと思います。複数のリストに最大サイズがある場合、価格の合計が最小となる最大サイズのリストを選択する必要があります。上記の例で選択する必要があるリストは、です。{(5,11),(7,9),(10,2)}

例2:およびN=10

F={(99,10),(12,23),(34,4),(10,5),(87,11),(19,10),(90,18),(43,90),(13,100),(78,65)}

この例のインスタンスに対する答えはです。[(13,100),(43,90),(78,65),(87,11),(99,10)]

これまで、これは私がしてきたことです:

  1. 元のリストを価格の昇順で並べ替えます。
  2. ソートされたリストのすべてのサブシーケンスを検索します。
  3. サブシーケンスが有効かどうかを確認し、すべての有効なサブシーケンスを比較してください。

ただし、これには指数関数的な時間がかかります。この問題をより効率的に解決するにはどうすればよいですか?

回答:


5

ビタミンの内容が有限のセット(たとえば、制限付き整数)からのものである場合、動的プログラミングソリューションはここで機能します。まず、果物を価格の昇順で並べ替えます。2つ以上の果物が同じ価格の場合は、ビタミン含有量で並べ替えます(降順)。ここで、をサブリスト内の果物の最大数として定義し、ビタミンの含有量が最大でである(ソートされたリストの)最後の果物のみを含みます。および 動的プログラミングを使用すると、M[f,v]fvM[0,]=0

M[f,v]={max{M[f1,v],1+M[f1,Vf]}if Vf<=vM[f1,v]otherwise
O(number of fruit×possible vitamin values)

::具体的に教えていただけますか?
ジャック

さて、あなたは何についてもっと詳しく知りたいですか?動的プログラミングに慣れていませんか?
Tom van der Zanden、2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.