Erase Subsequences

E - Erase Subsequences

参考:Educational Codeforces Round 82 A~E 题解

该题数据范围只有400,所以可以使用\(O(n^3)\)的写法。

\(dp[i][j]\)表示在 s 的第 i 个位置(从1开始)和 t1 的第 j 个位置,能够满足的 t2 的最大距离。

状态转移方程\(dp[i][j]=\begin{cases}dp[i-1][j]\\dp[i-1][j-1] (s[i-1]==t1[j-1])\\dp[i-1][j]+1 (s[i-1]==t2[j-1])\end{cases}\)

// Created by CAD on 2020/2/13.
#include <bits/stdc++.h>
#define mst(name, value) memset(name,value,sizeof(name))
using namespace std;

int dp[405][405];
bool judge(string s,string t1,string t2){
    mst(dp,-1);
    int slen=s.length(),t1len=t1.length(),t2len=t2.length();
    dp[0][0]=0;
    for(int i=0;i<slen;++i)
        for(int j=0;j<=t1len;++j)
            if(dp[i][j]>=0){
                if(j<t1len&&s[i]==t1[j])
                    dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]);
                if(dp[i][j]<t2len&&t2[dp[i][j]]==s[i])
                    dp[i+1][j]=max(dp[i+1][j],dp[i][j]+1);
                dp[i+1][j]=max(dp[i+1][j],dp[i][j]);
            }
    return dp[slen][t1len]>=t2len;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;cin >> T;
    while(T--){
        string s,t;cin>>s>>t;
        int slen=s.length(),tlen=t.length();
        bool ok=0;
        for(int i=0;i<tlen;++i){
            if(judge(s,t.substr(0,i),t.substr(i,tlen-i))) {
                ok=1;break;
            }
        }
        puts(ok?"YES":"NO");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/CADCADCAD/p/12304534.html