bzoj5073

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;
}
View Code

 

posted @ 2017-11-02 07:50  19992147  阅读(133)  评论(0编辑  收藏  举报