dp
字符串dp不太会啊。。。
这种序列和子串的匹配一般设两个状态,dp[i][j]表示当前s匹配到i,t匹配到j的...,g[i][j]表示当前s匹配到i,t匹配到j,i,j必须匹配的...,noip2015的子串也是这个套路,这道题是设最远能匹配到哪里,贪心显然,转移具体看代码,注意一定要把条件和转移匹配清楚。。。
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int n, m, x; char s[N], t[N]; int dp[N][110], g[N][110]; int main() { int T; scanf("%d", &T); while(T--) { int mx = 0; memset(dp, 0, sizeof(dp)); memset(g, 0, sizeof(g)); scanf("%d%d%d%s%s", &n, &m, &x, s + 1, t + 1); for(int j = 1; j <= x; ++j) for(int i = 1; i <= n; ++i) { dp[i][j] = dp[i - 1][j]; if(s[i] == t[g[i - 1][j] + 1]) g[i][j] = g[i - 1][j] + 1; // if(s[i] == t[g[i - 1][j - 1] + 1]) g[i][j] = max(g[i][j], g[i - 1][j - 1] + 1); if(s[i] == t[dp[i - 1][j - 1] + 1]) dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1), g[i][j] = max(g[i][j], dp[i - 1][j - 1] + 1); dp[i][j] = max(dp[i][j], g[i][j]); mx = max(mx, max(dp[i][j], g[i][j])); } if(mx == m) puts("YES"); else puts("NO"); } return 0; }