オリジナルタイトル
トピック分析
可能であれば、最長増加サブシーケンスの接続点を見つけるために、被験者に知られているアカウントに同じ長さを取って、DPが行うことができる最長の増加シーケンスを維持しながら、接続は、全てのカットラインのシーケンスで指し示すことができません可能な限り小さく、DPを定義することができるように最後の数字配列をインクリメント、DP Iの最終値の最小長さは、配列をインクリメントされる、これは秩序のDPを有し、二部高速化するために使用することができるので、[i]は、初期化が、INFでありますNUM [i]は、以上の半分のみに各反復の値を更新すると、[i]は、最後のスキャンが再び最長長DP配列から得ることができる更新NUMを検索します。
コード
1の#include <iostreamの> 2の#include <アルゴリズム> 3の#include <ユーティリティ> 4の#include <cstdioを> 5の#include <cmath> 6の#include <CStringの> 7の#include < ストリング > 8の#include <ベクトル> 9# <積層体>含む 10の#include <キュー> 11の#include <地図> 12 <の#include 設定 > 13 14 使って 名前空間STDを、 15 typedefの長い 長いLL。 INF_INT = 0x3f3f3f3f 。 17 CONST LL INF_LL = 0x3f3f3f3f3f3f3f3f 。 18 19 のint DP [ 50000 ]。 20 21 のint main()の 22 { 23 // freopenは( "black.in"、 "R"、STDIN)。 24 // freopenは( "black.out"、 "W"、STDOUT)。 25 int型のT; 26 cinを>> トン。 27 一方(t-- ) 28 { 29 INT N。 30 CIN >> N。 31 のための(int型 I = 0 ; iが<= N; iが++)DP [I] = INF_INT。 32 のために(int型 I = 0 ; iがN <; Iは++ ) 33 { 34 のint X; 35 のscanf(" %dの"、およびX) 36 * LOWER_BOUND(DP、DP + N、X)=のX。 37 } 38 // のための(INT i = 0; iがn <; iは++)のprintf( "DP [%のD] =%Dを\ n"、I、DP [I])。 39 INT ANS = 0 。 40 しばらく(DP [ANS] = INF_INT!)ANS ++ ; 41 coutの<< ANS << てendl; 42 } 43 リターン 0 。 44 }