zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    资料网站
    HTML、CSS部分
    面试题三
    面试题二
    面试题一
    上学时的HTML+JS+CSS(小总结)
    01.策略模式-上篇
    【解决方案】HTTP could not register URL http://+:6001/
    【问题与思考】1+"1"=?
    WCF安全3-Transport与Message安全模式
  • 原文地址:https://www.cnblogs.com/19992147orz/p/7770502.html
Copyright © 2011-2022 走看看