それは心に王建、Wudeng言及 - 「フェイト/ステイナイト」
トピック:https://www.luogu.org/problem/P1091
あるべきこの質問は、より古典的な、比較的単純な動的な規制の問題です。
その性質も明らかテンプレートです -
これは、最も長いシーケンス上昇であります
だから、T1の動的な規制<T2 <... <チタン>チタン+ 1> ...> Tkはそれを知っていることが理解されなければなりません
さて、この質問はまた、少なくとものうち少し考慮しなければならない、それはほとんど残っていることを意味し、
だから、LIS本当のハンマー:
限り左に各点として、最も長い系列の右側にある最長のサブシーケンスおよびその上昇の衰退求めているが主導し、それが最大の数の中央を残していたと付け加えました。
まあ、コード上:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 int型 N、MAXN = 0 。 INT [ 105 ]。 INT [F 105 ] [ 4 ]。 INT メイン() { scanf関数(" %のD "、&N) 以下のために(int型 i = 1 ; iが<= N; iが++ ) { scanf関数(" %dを"&[I])。 F [i]を[ 1 ] = F [i]が[ 2 ] = 1 。 } 以下のために(int型 I = 2 ; iが<= N; iが++ ) { ための(int型、J = 1、J <I、J ++ ) { 場合([I]> [J] && F [J] [ 1 ]> = F [I] [ 1 ]) { F [i]が[ 1 ] = F [J] [ 1 ] + 1 。 } } } のための(int型 I = N- 1、I> = 1 ; i-- ) { ため(int型 J = I + 1、J <= N; J ++) { IF([I]> A [J] && F [J] [ 2 ]> = F [I] [ 2 ]) { F [I] [ 2 ] = F [J] [ 2 ] + 1 ; } } } // 最長シーケンス上昇と最大減少シーケンスを見つける ための(INT I = 1 ; I <= N-I ++ ) { [F [I] 。3 ] [= F [I] 。1 ] + F [Iを] [ 2 ] - 1。; IF(F [I] [ 3 ]> MAXN) MAXN = F [I] [ 3]; // これは、予約済みの数である } のprintf(" %d個の\ N- "、N - MAXN); // n個-MAXNをキックオフされ 、戻り 0 ; }
私は出力がMAXNで始め、結果は上の2つのポイントです
アゲイン -
詳細は、成功または失敗のああを決定します!!!!!