HDU - 6578ブランクDP

ブランク

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 = 0K <= 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 
} 

/ * 
* /

 

おすすめ

転載: www.cnblogs.com/CJLHY/p/11231245.html
おすすめ