最も長いシーケンスは落ちません
トピックへのリンク:https://nanti.jisuanke.com/t/248
トピック:
最長シーケンスの長さが減少されていません探しています
最初の行n、n個の第2行番号の数を表し、nは
最長シーケンスの長さが低減されません
Nは各NUM 5000未満である<= MAXINT
サンプル入力
3 1 2 3
サンプル出力
3つの
アイデア:O(n個の* n)であり、あなただけの、すなわちLOWER_BOUND、メンテナンス単調な配列、使用して、nlognアプローチを試してみましたので、ここでは、貪欲+二部nlognの練習を学んでください
シーケンス(1、7、3、への5、9、4、8)、DP変更処理は以下の通りであります:
- DP [0] [0] = 1、LIS要素の端部の最小長さは、自然を選択する必要はありませんでした=最初の数です。(DP = {1})
- [1] 7、[1]> DP [0] =、したがって直接DPの末尾に追加するために、DP [1] [1] =。(DP = {1,7})
- [2] = 3、DPのために[0] <[2] <DP [1]ので、[2]あるいはDP [1]、DPなる[1] = [2]、2の長さはLIS、要素の終わりはあまりそれは、新しい要素を追加するには良いのフォローアップがあるので、3 7あまりにも自然に良いです。(DP = {1,3})
- [3] = 5、[3]> DP [1]、このように直接DPの最後に追加、DP [2] [3] =。(DP = {1、3、5})
- [4] = 9、[4]> DP [2]、従ってまたDPの端部に直接添加するために、DP [3] [9] =。(DP = {1、3、5、9})
- [5] 4 =ため、DP [1] <[5] <DP [2]、そう[5] DP 5の代わりに値[2]、従ってLIS 3、4の長さは、要素を終了します5よりも良い、小さいより良いもの。(DP = {1、3、4、9})
- [6] = 8、DP [2] <[6] <DP [3]は、同様に[6]あるいは値DP 9 [3]、あなたが知っている理由。(DP = {1、3、4、8})
完全なDPを維持するために、このようなサブアレイ、DPは、アレイLIS 4の必要な長さの長さです。
次のようにACコードは次のとおりです。
// // 2019年8月9日に羽生によって作成されます。 // する#include <アルゴリズム> 書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include <キュー> の#include < 設定 > 書式#include <math.h>の 書式#include <マップ> 使用して 名前空間はstd; typedefの長い 長いLL。 const int型 MAXN = 1000年 + 7 。 #define MAX 0x3f3f3f3f INT メイン() { INT [MAXN]、DP [MAXN]。 INT N-; ながら(〜scanfの(" %のD "&、N-)) { memsetの(A、0、はsizeof (A)) のmemset(DP、0、はsizeof (DP)); のための(INT I = 0、I <N-; I ++ ) { scanfの(" %のD "、A&[I]); DPは、[I]は = MAXは; //最大値を初期化DP } int型の POS = 0 ; //最後のビットの配列インデックスDP DP [ 0 ] A = [ 0]; 以下のために(int型 i = 1 ; iは<N; iは++ ) { 場合([I]> = DP [POS]) DPは、[ ++ posは] = [I]。 他 DP [LOWER_BOUND(DP、DP + POS + 1、[I]) - DP = [I]。 } のprintf(" %d個の\ n "、POS + 1 )。 } 戻り 0 。 }