この感覚は、デザインの状態の問題について非常に特定であります
開始列挙を考えること、貪欲マッチングストリングに対する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 " ); } }