ブリッジ信号POJ 1631(最長増加するシーケンスDP)

オリジナルタイトル

トピックリンク

トピック分析

可能であれば、最長増加サブシーケンスの接続点を見つけるために、被験者に知られているアカウントに同じ長さを取って、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 }

 

おすすめ

転載: www.cnblogs.com/VBEL/p/11408916.html