+デザイン思考DP国家暴力--cf1303E

この感覚は、デザインの状態の問題について非常に特定であります

開始列挙を考えること、貪欲マッチングストリングに対するT Sの最初の半分であり、その後マッチTの後半の残りかどうか

配列は、(シグネチャシーケンスに対応する)特徴T Sの後半に一度だけ発生し得るので、このアイデアは、(試料が通過できない)は明らかに間違っています

しかし、署名シーケンスs tは貪欲試合の前半に起因する、破壊され、マッチの後半は成功していません

 

次に[I] [J]マッチ列挙する次いで、列挙Tの前部と後部半分の二次元DPを考えます

/ * 
列挙POS:1-> T、T%がT [1..pos]とt [POS + 1..T] 2つの文字列が分割されている
、[i] [j]がT1と一致するiビットを表し、DP T2 S接頭最短ビットj一致する
* / 
の#include <ビット/ STDC ++ H.>
 使用して 名前空間STD;
 の#define N 405 チャーS [N]、T [N];
 int型、S、T、DP [N] [Nを]、NXT [N] [ ている26 ]、POS [ 26である]; ボイドのinit(){
     ためにINT I = 0 ; I < 26であり ; I ++)POS [I] = S + 1 ;
     のためのINT I = S、I> = 0 ; i-- ){
         ためINT J = 0



; J < 26 ; J ++ 
            NXT [I] [J] = POS [J]。
        もし(I)POS [S [I] - ' ' ] = I。
    } 
} チャーT1 [N]、T2 [N]。
int型LEN1、LEN2。
INT解く(INT POS){
     ためintは iは= 0 ; I <= T; I ++ のためのINT J = 0 ; J <= T; J ++ 
            DP [I] [J] = 0x3f3f3f3f 
    LEN1 = POS、LEN2 = T- POS;
    にとって

INTは iは= 1 ; I <= LEN1; I ++)T1 [I] = T [i]は、
    INTは iは= 1 ; I <= LEN2; I ++)T2 [I] = T [I + POS]。
    
    DP [ 0 ] [ 0 ] = 0 ;
    以下のためにINT iは= 0 ; I <= LEN1; I ++ のためのINT J = 0 ; J <= LEN2あり、j ++ ){
             場合(I == 0 && jの== 0続けますもし(I){
                 int型最後= DP [I- 1] [J]。
                もし(最後の<= S)
                    DP [I] [J] =分(DP [I]、[J]、NXT [最終] [T1 [i]が- ' ' ])。
            } であれば(J){
                 int型最後= DP [I]、[J- 1 ]。
                もし(最後の<= S)
                    DP [I] [J] =分(DP [I]、[J]、NXT [最終] [T2 [J] - ' ' ])。
            } 
        } もし(DP [LEN1] [LEN2 <= S)リターン1 リターン0 ; 
} int型のmain(){
     int型
            
      

TT; cinを>> TT;
    一方、(tt-- ){ 
        scanf関数(" %S%S "、S + 1、T + 1 )。
        S = STRLEN(S + 1 )。
        T = STRLEN(T + 1 )。
        初期化(); 
        
        INTフラグ= 0 以下のためにINT iは= 1 ; I <= T; iが++ 場合(解く(I))フラグ= 1 もし(フラグ)プット(" YES " );
        他のプット("NO " ); 
    }     
}

 

おすすめ

転載: www.cnblogs.com/zsben991126/p/12311230.html