私は問題を解決しようとしているので、コードを探していませんが、同様のアルゴリズムのために自分で解決できます。
n
本の本が入ったsize
本棚が与えられます。次のように、これらの本棚のsomeを新しい部屋に移動します。
i-1
またはi+1
(例:?-4-5-?/?-5-6-?/?-4-5-6-?は配置できません);したがって、本棚1は常に新しい部屋にあります。さらに、本棚i
が部屋にある場合は、どちらもi-1
、またはi+1
が部屋に入ります。
本棚のどの構成が私に最も多くの本を提供しますか?
これは動的プログラミングアルゴリズムを使用して解決されることを理解していますが、どちらがよいかわかりません。最初はナップザックの問題に似ていると思っていましたが、本の数に制限はないため、明らかに異なります(少なくとも私はそう思います)。目標の複雑さはO(n)ですが、私を助けるどんなアイデアでも実行できます。
この問題は 最長のサブシーケンスの増加 問題に似ています。各本棚の中に本の数を配列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]
しかし、値が負になる可能性がある場合、これは機能しません