web-dev-qa-db-ja.com

動的プログラミング-本棚の最大の配置

私は問題を解決しようとしているので、コードを探していませんが、同様のアルゴリズムのために自分で解決できます。

n本の本が入ったsize本棚が与えられます。次のように、これらの本棚のsomeを新しい部屋に移動します。

  • 最初の本棚は常に移動されます。
  • 新しい部屋で本棚の順序を維持します(新しい部屋で位置を変更することはできません)。
  • 書棚iをどちらの書棚の横にも配置できませんi-1またはi+1(例:?-4-5-?/?-5-6-?/?-4-5-6-?は配置できません);

したがって、本棚1は常に新しい部屋にあります。さらに、本棚iが部屋にある場合は、どちらもi-1、またはi+1が部屋に入ります。

本棚のどの構成が私に最も多くの本を提供しますか?

これは動的プログラミングアルゴリズムを使用して解決されることを理解していますが、どちらがよいかわかりません。最初はナップザックの問題に似ていると思っていましたが、本の数に制限はないため、明らかに異なります(少なくとも私はそう思います)。目標の複雑さはO(n)ですが、私を助けるどんなアイデアでも実行できます。

5
Xzenon

この問題は 最長のサブシーケンスの増加 問題に似ています。各本棚の中に本の数を配列Nに格納するとします。

N [i] =書棚iの本の数。

配列Sを保持します。S[i]は、アイテムiを含むアイテム1からiのサブセットを使用して他の部屋に到達できる最大値です。

S [1] = N [1]

S [i] = max(S [1]、S [2]、... S [i-2])+ N [i]、i = 3..N.Sizeの場合

答えは、値max(S[N.Size], S[N.Size - 1])になります。あなたが取る実際のアイテムを取得するには、別の配列に追加情報を保持できますPREV [i]-新しい部屋のiの前のアイテム。

これはO(n ^ 2)時間で実行されますが、インターバルツリーまたはバイナリインデックス付きツリーを使用して対数時間の最大値を取得することで、これをO(nlogn)に改善できます(最長の増加と同様)サブシーケンス問題)

更新:値が正の場合、これをO(n)で解決できることがわかりました

S [i] = max(S [i-2]、S [i-3])+ N [i]

しかし、値が負になる可能性がある場合、これは機能しません

1
Adrian Buzea