羅区P1091コーラスキュー

それは心に王建、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つのポイントです

アゲイン -

詳細は、成功または失敗のああを決定します!

おすすめ

転載: www.cnblogs.com/fjnhyzcrx-Mayuri/p/11525133.html