DP [O] [I] [J] [K]
oは最終Oに、それぞれ、正面を充填している表し、I、J、K、Rは廃棄正当から転送されていない制限R、に投入直接DP異なる数、。
#pragma GCC最適化(2) の#pragma GCCの最適化(3) の#pragma GCCの最適化(4) の#include <ビット/ STDC ++。H> に#define LL長い長 の#define LD長い二重 の#defineは、符号なしの長い長いULL の#define第Fiが #define SE第二 の#define MK make_pair の#define PLL対<LL、LL> の#define PLI対<LL、整数> の#define PII対<整数、整数> の#define SZ(X)((INT)x.size() ) の#define ALL(X)(X).begin()、(X).END() の#define FIOイオス:: sync_with_stdio(偽); cin.tie(0)。使用して 名前空間はstd; CONSTの INT N = 100 + 7 。 const int型 INF = 0x3f3f3f3f 。 constの LL INF = 0x3f3f3f3f3f3f3f3f 。 const int型のmod = 998244353 ; constの ダブル EPS = 1E- 8 ; CONST ダブル PI = ACOS( - 1 )。 テンプレート < クラス T、クラス S>インラインボイド追加(T&、S b)は{A + B =。もし(> = MOD)A - = MOD;} テンプレート< クラス T、クラス S>インラインボイドサブ(T&、S b)は、{ - = B。もし(< 0)、A + = MOD;} テンプレート < クラス T、クラス S>インラインBOOL chkmax(T&、S B)は{ 返す <bは?= B、真:偽;} テンプレート < クラス T、クラス S>インラインブール chkmin(T&、S b)は{ 返す > bは?= B、真:偽;} int型N、M。 int型の DP [2 ] [N] [N] [N]。 INT(* F)[N]、[N]はDPを= [ 0 ]。 INT(*、G)[N]、[N]はDPを= [ 1 ]。 int型T; ベクター <PII> V [N]。 無効のinit(int型n)を{ ため(int型 i = 0 ; iがn <; iは++ ){ ための(int型 J = 0 ; J <= I; J ++ ){ ための(int型のk = 0 ; K <= Jあり、k ++ ) { F [I] [J] [K] = 0 ; } } } } int型のmain(){ scanf関数(" %のD "、&T)。 一方、(T-- ){ scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ V [i]が.clear(); } のために(int型 I = 1 ; I <= M; iは++ ){ int型のL、R、X。 scanf関数(" %D%D%D "、&L&R&X)。 V [R] .push_back(MK(L、X)); } INIT(1 )。 F [ 0 ] [ 0 ] [ 0 ] = 4 。 ブール裁判官; 用(INT O = 1 ; 0 <N; O ++ ){ スワップ(F、G)。 INIT(O + 1 )。 以下のために(int型 i = 0 ; I <Oであり; iは++ ){ ための(int型 J = 0 ; J <= I; J ++ ){ 用( INTK = 0。K <= J。K ++ ){ 場合(G [I] [J] [K])!の続けます。 裁判官 = 真; 用(オート&{:V [O] T) であれば(t.se == 1 ){ 場合(I> = t.fi){ 裁判官 = 偽。 破ります; } } 他の 場合(== t.se 2 ){ 場合(I <t.fi || J> = t.fi){ 裁判官 = 偽。 破ります; } } そう であれば(t.se == 3 ){ 場合(J <t.fi || K> = t.fi){ 裁判官 = 偽。 破ります; } }他{ もし(K < t.fi){ 裁判官 = 偽。 破ります; } } } 場合(裁判官)は、{ (F [I] [J] [K]、G [i]は[J] [K])を追加します。 追加(F [O] [I]、[J]、G [i]は[J] [K])。 追加(F [O] [I] [K]、G [i]は[J] [K])。 追加(F [O] [J] [K]、G [i]は[J] [K])。 } } } } } int型 ANS = 0 。 用(int型 iは= 0 ; iがN <I ++は{) のための(INT J = 0 ; J <= I; J ++ ){ ため(int型 = K 0 ; <= J kは、kは++ ){ 場合(DP [I! ] [j]は[K])続けます。 裁判官 = 真; 用(オート&T:V [N]){ 場合(== t.se 1){ もし(I> = t.fi){ 裁判官 = 偽。 破ります; } } そう であれば(== t.se 2 ){ 場合(I <t.fi || J> = t.fi){ 裁判官 = 偽。 破ります; } } それ以外 の場合(== t.se 3){ もし(J <t.fi || K> = t.fi){ 裁判官 = 偽。 破ります; } } 他{ もし(K < t.fi){ 裁判官 = 偽。 破ります; } } } もし(裁判官){ 追加(ANS F [I] [J] [K])。 } } } } printf(" %d個の\ n " 、ANS)。 } 戻り 0 。 } / * * /