Erase Subsequences
Posted cadcadcad
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
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 - 题解