軸上のDPビルドは、各区間を格納することは、最終的にはどのような境界条件を決定するために覚えているところから転送することができます
コード:
#include <ビット/ STDC ++。H> に#define INT長い長 の#define SC(A)のscanf( "%のLLD"、&A) の#define SCC(B)のscanf( "%のLLDの%のLLD"、&、&B) #define SCCC(A、B、C)のscanf( "%LLD%LLD%LLD"、&、&B、&C) の#define SCHAR(A)のscanf( "%のC"、&A) の#define PR(A)のprintf( "%のLLD"、A) の#defineは(iは、b)のための(iは= int型foは、私は、Bを<; ++ i)は、 の#define再(I、B)(iは= int型のために、私<= B; ++ I) の#define RFO(I、B)(iは= int型のために、I> B; - I) の#define RRE(I、B)(iは= int型のために、 I> = B; - I) の#define PRN()のprintf( "の\ n") の#define PRS()のprintf(」 " ) の#define MKP make_pair の#definePII対<整数、整数> の#defineパブ(a)の一back(A) の#define POB()pop_back() の#define PUF(a)はpush_front(A) の#define POF()pop_front() の#define FST最初 の#define SND第二 の#define FRTフロント() の#defineバック()BAK の#define MEM0(A)のmemset(0、はsizeof(A)) の#define memmx(A)のmemset(0x3f3fを、はsizeof(A)) の#define memmn (A)のmemset(、-0x3f3f、はsizeof(A)) の#defineデバッグ の#defineダブルデシベル の#define yyesはcout << "YES" <<てendlを。 #define NNO裁判所未満<< "NO" <<てendl; 使用して 名前空間はstd; ベクトルのtypedef < 整数 > VEI。 ベクトルのtypedef <PII> VEP。 マップのtypedef < int型、int型 > MPII。 マップのtypedef < CHAR、INT > MPCI。 マップのtypedef < 文字列、int型 > MPSI。 typedefの両端キュー < 整数 > deqi。 両端キューのtypedef < 文字 > deqc。 typedefのPRIORITY_QUEUE < 整数 > mxpq。 typedefのPRIORITY_QUEUE < INT、ベクトル< INT >、大きな< INT >> mnpq。 typedefのPRIORITY_QUEUE <PII> mxpqii。 typedefのPRIORITY_QUEUE <PII、ベクトル<PII>、大きな<PII>> mnpqii。 const int型 MAXN = 3000005 ; const int型 INF = 0x3f3f3f3f3f3f3f3f 。 const int型 MOD = 100000007 ; CONST DB EPS = 1E- 10 。 INT qpow(INT A、INT B){ int型 TMP =%MOD、ANS = 1。同時に(B){ 場合(B&1){ANS * = TMP、ANS%= MOD;} TMP * = TMP、TMPの%= MOD、B >> = 1 ;} 戻りANS;} int型 lowbit(INT X){ リターン X& - X;} int型の最大値(int型、int型 b)は、{ 戻る > B?A:B;} int型分(INT A、INT B){ 戻り <bは?A:B;} int型(MmaxをINT、int型 B、INT {c)に戻り};最大(MAX(B、C)) のint MMIN(int型、int型 B、int型の){Cを返す;分(分(B、C))} ボイド MOD(INT {A + = MOD;%=&A)MODを;} ブール CHK(INT )は{} INT半分(int型 L、int型 R){ 一方(L <= R){ int型、M =(L + R)/ 2。もし(CHK(M))はr = M- 1。他 L = M + 1 ;} 戻りL;} int型 LL(INT P){ リターン P << 1 ;} int型の RR(int型P){ 戻り P << 1 | 1 ;} int型 MM(int型 L、INT R){ リターン(L + R)/ 2 ;} int型 LG(INT X){ もし(x == 0)リターン 1。リターン(INT)LOG2(X)+ 1 ;} ブール smleql(dBのB、DB){ 場合(<B ||ファブ(AB)<= EPS)を返す 真。戻り 偽}; DB LEN(DB、DBのB、dBのC、DB d)は{ 戻りSQRT((AC)*(AC)+(BD)*(BD ));} BOOL ISP(INT X){ 場合(x == 1)を返す 偽。もし(Xの== 2)を返す 真。以下のための(int型 I = 2を ;;私は= xを<* ++ i)があれば(のx%iの== 0)を返す 偽。戻り 真;} インラインint型リード(){ CHAR CH = GETCHAR()。INT S = 0、W = 1 。 しばらく(CH < 48 || CH> 57){ 場合(CH == ' - ')W = - 1 ; CH = GETCHAR();} 一方(CH> = 48 && CH <= 57){S =(S << 1)+(S << 3) + CH- 48、CH = GETCHAR();} 戻り S * W。 } インラインボイド書き込み(INT X){ 場合(X < 0)のputchar(' - ')、X = - X。 もし(X> 9)書き込み(X / 10 +)。 putchar(X%10 48 )。 } int型 GCD(INT A、INT B){ 場合(== 0)リターンB。 場合(Bの== 0)を返します。 もし((A&!1)&&(B&!1))戻り GCD(>> 1、B >> 1)<< 1 。 それ以外の 場合(!(B&1))リターン GCD(A、B >> 1 ); それ以外の 場合(!(A&1))戻り GCD(A >> 1 、B)。 他 戻り GCD(ABS(A- B)、分(b)参照)。 } INT LCM(int型のx、int型 Y){ リターン・ X *のY / GCD(X、Y);} int型のn、X、Yは、 VEI [MAXN]事前; int型DP [MAXN]。 {main()の符号付き ios_base :: sync_with_stdio(0 )。 cin.tie(0)、cout.tie(0 )。 cinを >> N; (I、再1、N)CIN >> X >> Y、予め[Y] .PUB(X)。 memmn(DP)。 DP [ 0 ] = 0 ; 再(I、1、3000000 ){ DP [I] = DP [I- 1 ]。 FO(j、0 、予め[I] .size()){ DP [I] = MAX(DP [i]は、(PRE [I] [J]> = 1、DP [プレ[I] [J] - ?1 ]:0)+ I予め[I] [J] + 1 )。 } } COUT << DP [ 3000000 ]。 リターン 0 ; }