Palmiaがあり、まっすぐであるN個の異なる都市の海岸に、独自のポジションを持っている川の川東西、南北両側を所有していました。
各都市のノースショアで唯一の南ではなく、さまざまな都市で友好都市が姉妹都市は同じではありません。
姉妹都市の各ペアは、川の上に2つの都市を結ぶチャネル直線を開くために政府に適用されているが、原因あまりにも川霧に、政府は事故を避けるために、任意の2つのクロスチャネルを避けることにしました。
政府が承認し、任意の二つのディスジョイントなルートの場合は保証のアプリケーションを拒否し、いくつかの意思決定を支援するためのプログラムは、アプリケーションが可能な限り承認されています。
入力形式
1行目に、整数N、都市の数。
N +分離中間空間を有する2つの整数の1本のラインのライン2は、それぞれ姉妹都市との右バンクの一組の座標を表します。
出力フォーマット
唯一のライン、出力政府によって承認することができるアプリケーションの最大数を表す整数。
データ範囲
1 ≤ N ≤ 5000 1≤N≤5000、
0 ≤ X iは≤ 10000 0≤xi≤10000を
サンプル入力:
7
22 4
2 6
10 3
15 12
9 8
17 17
4 2
出力例:
4
分析:
ソートしながら、まず、需要の反対側の最大値が単調(対応が単調都市間の交差することなく適合することが上昇しながら)、シーケンスを増加させます
普通のソリューション:
書式#include <iostreamの> の#include <アルゴリズム> 使用して名前空間はstdを、const int型 N = 5050 ; typedefのペア < int型、int型 > PII。 int型のn; PIIをQ [N]。INT DP [N]。INT メイン(){ scanf関数(" %のD "、&N) 以下のために(int型私= 1 ; iが<= N; iが++)のscanf(" %D%D "、&Q [i]が1次回、&Q [i]の.second)。 ソート(Q + 1、Q + N + 1 ); int型のres = 0 ; 以下のために(int型 i = 1 ; iが<= N; iは++ ){ DP [I] = 1 。 用(INT J = 1 ; J <= I; J ++ ){ 場合(Q [i]が.second> Q [J] .second) DP [I] = MAX(DP [I]、DP [J] + 1 ) ; } RES = MAX(RES、DP [I])。 } COUT << RES。 }
ファンシーソリューション:
1の#include <iostreamの> 2の#include <アルゴリズム> 3 4 使用して 名前空間STD。 5 6 のconst int型 N = 5050 。 7のtypedef対< INT、INT > PII。 8 INT N。 9 PIIのQ [N]。 10 int型DP [N]。 11 12 ブール COMP(対< 整数、整数 > A、対< INT、INT > B){ 13 リターン a.second < b.second。 14 } 15 16 INT メイン(){ 17 のscanf(" %d個"、&N) 18 のために(int型 i = 1 ; iが<= N; iが++)のscanf(" %D%dの"、&Q [i]が1次回、&Q [i]の.second)。 19 20 ソート(Q + 1、Q + N + 1 、COMP)。 21の INTは RES = 0 。 22 のためには、(int型 i = 1 ; iがn = <; iは++ ){ 23 、DP [I] = 1 。 24 用(INT J = 1 ; J <= I; J ++ ){ 25 であれば(Q [i]が1次回> Q [j]が1次回) 26 DP [I] = MAX(DP [I]、DP [J] + 1 ); 27 } 28の RES = MAX(RES、DP [I])。 29 } 30 COUT << RES。 31 }