codeforces EDC Round82 E - EraseSubsequences

codeforces EDC Round82 E - EraseSubsequences

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

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

状态转移方程\(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}\)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 3e5+10;

int dp[410][410];
bool judge(string s, string t1, string t2){
    int slen = s.size(), t1len = t1.size(), t2len = t2.size();
    memset(dp, -1, sizeof(dp));
    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 && s[i] == t2[dp[i][j]]){
                    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;
}
void solve(){
    string s, t;
    cin >> s >> t;
    int slen = s.size(), tlen = t.size();
    bool flg = 0;
    for (int i = 0; i < tlen; i++){
        if(judge(s, t.substr(0, i), t.substr(i, tlen-i))){
            flg = 1;
            break;
        }
    }
    if (flg)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}
int main(){
    ios_base::sync_with_stdio(0);
    int t;
    cin >> t;
    while(t--){
        solve();
    }
    return 0;
}
posted @ 2020-02-17 22:07  Frnas  阅读(74)  评论(0编辑  收藏  举报
Language: HTML