Erase Subsequences

Posted cadcadcad

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]=egin{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;
}

以上是关于Erase Subsequences的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces1303E. Erase Subsequences

动态规划-Distinct Subsequences

codeforces 497E Subsequences Return

CF 689D - Friends and Subsequences

**Leetcode 659. Split Array into Consecutive Subsequences

Codeforces Round #750 (Div. 2) - B. Luntik and Subsequences - 题解