• 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;
    }
    /*
    */
    
  • 相关阅读:
    行为模式
    行为模式
    行为模式
    行为模式
    行为模式
    结构模式
    kafka 学习整理
    Hive文件格式,以及ORC创建使用
    GBDT 介绍
    机器学习中的特征工程 —— 七月在线总结
  • 原文地址:https://www.cnblogs.com/valk3/p/12810334.html
Copyright © 2020-2023  润新知