State violence dp + Design Thinking --cf1303E

This feeling is very particular about the question of the state of design

Thinking beginning enumeration is the first half of the s, t to greedy matching string, and then see whether the remainder of the second half of the match t

However, this idea is obviously wrong (sample can not pass) because the sequence may occur only once in the second half of a feature t s (corresponding to a signature sequence),

However, the signature sequence s t is due in the first half of the match greedy, is broken, the second half of the match is not successful

 

Then think of the front and rear halves of the enumerated t, then a two-dimensional dp [i] [j] matches to enumerate the

/ * 
Enumeration pos: 1-> T, t% is divided t [1..pos] and t [pos + 1..T] two strings 
dp [i] [j] denotes the i bits matching t1, t2 s prefix matching the shortest bit j 
* / 
#include <bits / STDC ++ H.>
 the using  namespace STD;
 #define N 405 char s [N], T [N];
 int s, T, DP [N] [N ], NXT [N] [ 26 is ], POS [ 26 is ]; void the init () {
     for ( int I = 0 ; I < 26 is ; I ++) POS [I] = S + . 1 ;
     for ( int I = S; I> = 0 ; i-- ) {
         for ( int J = 0



;j<26;j++)
            nxt[i][j]=pos[j];
        if(i)pos[s[i]-'a']=i;
    }
}

char t1[N],t2[N];
int len1,len2;
int solve(int pos){
    for(int i=0;i<=T;i++)
        for(int j=0;j<=T;j++)
            dp[i][j]=0x3f3f3f3f;
    len1=pos,len2=T-pos;
    for(int i=1;i<=len1;i++)t1[i]=t[i];
    for(int i=1;i<=len2;i++)t2[i]=t[i+pos];
    
    dp[0][0]=0;
    for(int i=0;i<=len1;i++)
        for(int j=0;j<=len2;j++){
            if(i==0 && j==0)continue;
            if(i){
                int last=dp[i-1][j];
                if(last<=S)
                    dp[i][j]=min(dp[i][j],nxt[last][t1[i]-'a']);
            }
            if(j){
                int last=dp[i][j-1];
                if(last<=S)
                    dp[i][j]=min(dp[i][j],nxt[last][t2[j]-'a']);
            }
        }
    if(dp[len1][len2]<=S)return 1;
    return 0;
}

int main(){
    int tt;cin>>tt;
    while(tt--){
        scanf("%s%s",s+1,t+1);
        S=strlen(s+1);
        T=strlen(t+1);
        init();
        
        int flag=0;
        for(int i=1;i<=T;i++) 
            if(solve(i))flag=1;
        if(flag)puts("YES");
        else puts("NO");
    }    
} 

 

Guess you like

Origin www.cnblogs.com/zsben991126/p/12311230.html