$ Noip2013 / Luogu1970 $庭師の$ DPます$ +思考

$ Luogu $

 

$ソル$

そして、$ Poj1037 \ A \装飾\フェンス $は、 アクリジンに見えました。

$ F [I] [0/1] $ $ I $は、この数が減少(増加)そのような配列の最大長に対して数であり、前部の数、および$ I $の選択された数を意味します。

$ F [i]が[0] = MAX(F [k]を[1])+ 1、K <I且H [K]> H [i]は$

$ F [i]が[1] = MAX(F [K] [0])+ 1、K <I且H [K]> H [i]は$

最後の答えは、[I] [0/1] $ F $ MAX_ {i = 1} ^ {N}です。

しかしながら、そのような複雑さは$ O(N ^ 2/2)$、としないAC $ $は、最適化は、または[I] [0/1変数$ Fを維持することによって、内側ループに起こる容易に除去することができません] I-1] [0/1] $ $ Fでの$ Fの前に、後者を考慮し、実現可能にする、元が表示されますを導入し、直接の$ [に[I] [0] $ $ I $数が変更を意味します選択された数の数が、最後の数に対する数は、$ F、最長下降シーケンスの第2の長さの逆数である[I] [1]同様の$。しかしながら、私は、オープン伝達方程式TJ $を考えていませんでした.... OVO $

$ IF(時間[I]> H [I-1])F [i]を[1] = F [I-1] [0] +1; Fそう[I] [1] = F [I-1] [1]; $

$ IF(時間[I] <H [I-1])F [i]が[0] = F [I-1] [1] +1; Fそう[i]が[0] = F [I-1] [0]; $

最後に、答えは。$ [0/1] [n]は、F $です

最後の番号は谷がある場合、後者はより多くの選択肢の家紋であるので、このような理解のペアは、現在のシーケンスのために、私たちは、可能な限りこの数は限り小さく願っています。

 

$コード$

 

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include <キュー> 
の#include <アルゴリズム>
 に#define ILインライン
 の#define Rgを登録し
 ます。#define行く(I、A、B)は(RG int型I = A ; iが<= Bと、++ I)
 の#defineはい(I、B)のための(RG INT iは=; I> = B; - I)
 の#define MEM(B)のmemset(B 、はsizeof(A))
 の#defineっ長い長
 の#define DB二重
 の#define INF 2147483647
 使用 名前空間STDを、
ILのINTのリード()
{ 
    たRG INT X = 0、Y =1 ; チャー C = GETCHAR()。
    一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C = GETCHAR();}
     一方、(C> = ' 0 ' && C <= ' 9 '){X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = GETCHAR();}
     戻りのx *のY。
} 
のconst  int型 N = 100010 int型、N、H [N]。
LL F [N] [ 2 ]。
IL LL MAX(LLのX、LLのY){ 戻り X> Yの?X:Y;}
 int型のmain()
{ 
    N =読み取る();(I、行く1、N)H [I] = 読み取ります(); 
    F [ 1 ] [ 0 ] = F [ 1 ] [ 1 ] = 1 
    行く(I、2 、n)の
    { 
        場合(時間[I]> H [I- 1 ])F [i]を[ 1 ] = F [I- 1 ] [ 0 ] + 1 他に F [i]には、[ 1 ] F [I-= 1] [ 1 ]。
        もし(時間[私] <H [I- 1 ])F [i]が[ 0 ] = F [I- 1 ] [ 1 ] + 1  [I] [F 0 ] = F [I- 1 ] [ 0 ]。
    } 
    のprintf(" %LLDする\ n "、MAX(F [N] [ 0 ]、F [N] [ 1 ]))。
    リターン 0 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/forward777/p/11410363.html