zoukankan      html  css  js  c++  java
  • CF#358 D. Alyona and Strings DP

    D. Alyona and Strings

    题意

    给出两个字符串s,t,让找出最长的k个在s,t不相交的公共子串。

    思路

    看了好几个题解才搞懂。

    代码中有注释

    代码

    #include<bits/stdc++.h>
    #define pb push_back
    using namespace std;
    typedef long long ll;
    const int N=1e5+10;
    const int mod=1e9+7;
    const int inf=0x3f3f3f3f;
    
    char s[N],t[N],k;
    int dp[1010][1010][11][2];
    /*
    终于搞明白了
    dp[i][j][k][0]表示的是s的前i个字符,t的前j个字符,选择k个公共子串的最大值(不一定包括i,j)
    dp[i][j][k][1]表示的是s的前i个字符,t的前j个字符,选择k个公共子串最后是i,j的最大值
    dp[lens][lent][k][0]就是题目要求的答案。
    当s[i]==t[j]的时候dp[i][j][k][1]才存在(不为0)
    */
    int main()
    {
        int lens,lent;
        scanf("%d%d%d%s%s",&lens,&lent,&k,s+1,t+1);
        for(int i=1; i<=lens; i++)
        {
            for(int j=1; j<=lent; j++)
            {
                for(int l=1; l<=k; l++)
                {
                    if(s[i]==t[j])//只有s[i]==t[j]的时候才有dp[i][j][l][1]
                        dp[i][j][l][1]=max(dp[i-1][j-1][l][1]+1,dp[i-1][j-1][l-1][0]+1);
                    /*可以沿用之前的第l个公共子串,或者让i,j作为第l个子串的第一位*/
                    dp[i][j][l][0]=max(dp[i-1][j][l][0],max(dp[i][j-1][l][0],dp[i][j][l][1]));
                }
            }
        }
        printf("%d
    ",dp[lens][lent][k][0]);
        return 0;
    }
    /*
    */
    
  • 相关阅读:
    Autoit对win系统弹窗的操作
    Linux服务器测试网络连通性
    如何给linux配置两个不同网段的ip
    记下看过并觉得非常有用的文章
    使用python+selenium对12306车票数据读取
    windows系统mysql安装
    Python使用正则匹配re实现eval计算器
    css3[补1]
    Javascript[2]
    Javascript[1]
  • 原文地址:https://www.cnblogs.com/valk3/p/12810334.html
Copyright © 2011-2022 走看看