$ソル$
そして、$ 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 ; }