[化合物] 最長増加部分列 – LIQ

スレッドとテスト: リンク

N要素の配列は、A整数与えられました[1], ザ·[2], … ザ·[N].
つまり単調に増加するシーケンスを知ります 1 シリーズA[I1],… ザ·[私] 満足
I1 < I2 < … < 私はVA[I1] < ザ·[I2] < .. < ザ·[私]. 最長どのように多くの要素のこの一連の単調に増加するシーケンスを示してください?
テストVAソリューションをダウンロード (C / C++, パスカル) ここに.
入力
現在 1 含めて 1 整数は数Nであります (1 ≤N≤ 1000).
最初の行 2 Nは、レコードを整数[1], ザ·[2], .. ザ·[N] (1 ≤A[で] ≤ 10000).
出力
サブシーケンスの長さは最長の単調に増加することを忘れないでください.

入力:
6
1 2 5 4 6 2
出力:
4
試験例を説明します: 最長のサブシリーズA[1] = 1 < ザ·[2] = 2 < ザ·[4] = 4 < ザ·[5] = 6, これはシーケンス長であります 4.

最初の使用 1 配列bには、位置bでの配列の長さの増加をマークします[で] すべての. 最長の増加シーケンスをマーキング可変長最大. 当初はB[で] = 1 すべてのiについて, 最大= 1.
との範囲を閲覧します 1 ループ.
閲覧中, 各要素範囲で、我々は後方閲覧開始しました. Bの場合[で] <= B[J] と[で] > ザ·[J] aとb[で] <=マックス、我々はBを高めます[で] アップ= B[J] + 1; 最大を確認し、再割り当て.
最高経営責任者(CEO:
最初に
ザ·[] : 1 2 5 4 6 2
B[] : 1 1 1 1 1 1

改訂されました 1: (i = 1から)
ザ·[1] = 2. からブラウズ[0] 約[0].
我々は、b参照します[1] <= B[0] と[1] > ザ·[0] aとb[1] <=最大=> B[1] = B[0] + 1 = 2, 最大= B[1] = 2.
改訂されました 2: (I = 2)
ザ·[2] = 5. からブラウズ[1] 約[0].
+/ 考えると[1], 我々は、b参照します[2] <= B[1] と[2] > ザ·[1] aとb[2] <=最大=> B[2] = B[1] + 1 = 3, 最大= B[2] = 3.
+/ 考えると[0], B[2] = 3 > B[0] => 何もしません.
改訂されました 3: (I = 3)
ザ·[3] = 4. からブラウズ[2] 約[0].
+/ 考えると[2], 我々は、b参照します[3] <= B[2] しかし[3] < ザ·[2] => 何もしません
+/ 考えると[1], 我々は、b参照します[3] <= B[1] と[3] > ザ·[1] aとb[3] <=最大=> B[3] = B[1] + 1 = 3, 最大変わらず.
+/ 考えると[0], B[3] = 3 > B[0] => 何もしません.
改訂されました 4: (I = 4)
ザ·[4] = 6. からブラウズ[3] 約[0].
+/ 考えると[3], 我々は、b参照します[4] <= B[3] と[4] > ザ·[3] aとb[4] <=最大=> B[4] = B[3] + 1 = 4, 最大= B[4] = 4.
+/ 考えると[2], 我々は、b参照します[4] = 4 > B[2] => 何もしません.
+/ 考えると[1], 我々は、b参照します[4] = 4 > B[1] => 何もしません.
+/ 考えると[0], 我々は、b参照します[4] = 4 > B[0] => 何もしません.
改訂されました 5: (I = 5)
ザ·[5] = 2. からブラウズ[4] 約[0].
+/ 考えると[4], 我々は、b参照します[5] <= B[4] しかし[5] < ザ·[4] => 何もしません
+/ ザ·[3], ザ·[2], ザ·[1] 同様の
+/ 考えると[0], 我々は、b参照します[5] <= B[0] と[5] > ザ·[0] aとb[5] <=最大=> B[5] = B[0] + 1 = 2, 最大変わらず.
だから我々は持っている:
ザ·[] : 1 2 5 4 6 2
B[] : 1 2 3 3 4 2
最大= 4.