列の数を探していると、最も長いシーケンスを高めます
動的プログラミング:O(N ^ 2)
1 // DP 2 LIS(INT []、INT N-)INT 。3 { 4。 INT DP [N-]; 5 int値Cntが= -1; 6 のmemset(DP、0、はsizeof(DP)); 7 のための(INT I = 0; I <N - 、Iは++) 8 { 9。 (INT J = 0; J <I、J ++) 10 { 11 IF([I]> A [J]) 12れる { 13は DP [I] = MAX( DP [I]、DP [J] + +1); 14 Cntを= MAX(DP [I]、CNT); //最長の配列に含まれる要素の数を記録 15 } 16 } 17 } 18 Cntを+ 1を返す。ため// 0に初期化され、それは結果を返し+1 19 }
貪欲+二分法:O(nlogn)
分析:最長の配列と配列の上昇は、実際には、サブシーケンスを入力するバックできる限り、その要素に、配列の各要素は、可能な限り小さく、閾値を下げることを保証することであるせ
実装:最長シーケンス定義アレイ配列、ならびに現在の長さレンを、最初からメンテナンスアレイを終了します
[I]>配列[I](現在の要素の端部が配列要素よりも大きい)、[I]配列へ:配列[++ LEN]は[I] =
B [i]は<=配列[i]は、メンテナンスのアレイの場合、アレイ内の置換率[I] [I](素子の背面に低減することができる最初の大きな要素にサブシーケンスようしきい値。
C。アルゴリズムの複雑さを軽減するために、アレイ昇順シーケンスとしてであるので、使用LOWER_BOUND第〔I〕要素よりルックアップアレイ少なくありません
1 //贪心+二分 2 INT LIS([] INT) 3 { 4 INT Cntを= 0; 5 int配列[N + 1]。 6 配列[0] = [0]。 7 ため(; iはi = 1 int型<N; iは++) 8 { 9 ([i]の場合>配列[Cntを】) 10 配列[++ Cntが] = [I]。 11 他の 12 { 13 INTランキング= LOWER_BOUND(配列、配列+ Cntを+ 1、[I]) -配列。 14 配列[インデックス] = [I]。 15 } 16 } 17 リターンCntを+ 1。 18 }
需要最長のシーケンスの減少:
---、LDSアレイ逆の要件に直接記述する必要はない配列が最長系列長を上昇逆=元の配列の最長シーケンスの長さは減少しました。