• B. Catching Cheaters(最长公共子序列变形)


    Problem - 1446B - Codeforces

     

    给你两个字符串A和B,代表两个涉嫌作弊的学生的论文。对于任何两个字符串C,D,我们将其相似性分数S(C,D)定义为4⋅LCS(C,D)-|C|-|D|,其中LCS(C,D)表示字符串C和D的最长公共子序列。

    你认为只有部分文章可能被复制了,因此你对它们的子串感兴趣。

    计算所有子串对上的最大相似度分数。更正式地说,在所有对(C,D)上输出最大的S(C,D),其中C是A的某个子串,而D是B的某个子串。

    如果X是一个字符串,|X|表示其长度。

    如果一个字符串a可以通过从b中删除几个(可能是零个或全部)字符以及从结尾删除几个(可能是零个或全部)字符而得到,那么这个字符串就是一个字符串b的子串。

    如果一个字符串a可以通过删除几个(可能是零个或全部)字符从b中得到,那么它就是一个字符串b的子序列。

    请注意子串和子序列之间的区别,因为它们都出现在问题陈述中。

    你可以阅读维基百科上关于最长公次问题的网页。

    输入
    第一行包含两个正整数n和m(1≤n,m≤5000)--两个字符串A和B的长度。

    第二行包含一个由n个小写拉丁字母组成的字符串--字符串A。

    第三行包含一个由m个小写拉丁字母组成的字符串--字符串B。

    输出
    在所有对(C,D)中输出最大的S(C,D),其中C是A的某个子串,D是B的某个子串。

    例子
    输入复制
    4 5
    abba
    babab
    输出拷贝
    5
    输入复制
    8 10
    bbbbabab
    bbbabaaaaa
    输出拷贝
    12
    输入副本
    7 7
    uiibwws
    qhtkxcn
    输出拷贝
    0
    注意
    对于第一种情况。

    第一个字符串的abb和第二个字符串的abab的LCS都等于abb。

    结果是S(abb,abab)=(4⋅|abb|)-|abb|-|abab|=4⋅3-4=5。

    题解:

    说这到题前,我们先想想如何求两个字符串最长公共子序列

    如下

    1. for(int i = 1;i <= n;i++)
    2. {
    3. for(int j = 1;j <= m;j++)
    4. {
    5. if(a[i] == b[j])
    6. {
    7. f[i][j] = f[i-1][j-1] +1;
    8. }
    9. else
    10. {
    11. f[i][j] = max(f[i-1][j],f[i][j-1]);
    12. }
    13. ma = max(f[i][j],ma);
    14. }
    15. }

    但是这题加了一个条件,求最大得分 = 4*最长公共子序列长度 - 两个字符串长度

    同样定义f[i][j]为a以i结尾,b以j结尾的最大得分

    如果a[i] == b[j]

    f[i][j] = f[i-1][j-1] + 2根据题意

    关键是不等于的情况

    f[i][j] = max(0,max(f[i-1][j],f[i][j-1])-1);

    相当于是否要与状态f[i-1][j],f[i][j-1]接上来

    如果小于等于0就断开

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<cstring>
    4. #include<string>
    5. #include<map>
    6. #include<vector>
    7. #include<queue>
    8. using namespace std;
    9. char a[5005];
    10. char b[5005];
    11. int f[5005][5005];
    12. void solve()
    13. {
    14. int n,m;
    15. cin >> n >> m;
    16. cin >>a+1>>b+1;
    17. int ma = 0;
    18. for(int i = 1;i <= n;i++)
    19. {
    20. for(int j = 1;j <= m;j++)
    21. {
    22. if(a[i] == b[j])
    23. {
    24. f[i][j] = f[i-1][j-1] + 2;
    25. }
    26. else
    27. {
    28. f[i][j] = max(0,max(f[i-1][j],f[i][j-1])-1);
    29. }
    30. ma = max(f[i][j],ma);
    31. }
    32. }
    33. cout<<ma<<"\n";
    34. }
    35. int main()
    36. {
    37. int t = 1;
    38. // cin >> t;
    39. while(t--)
    40. {
    41. solve();
    42. }
    43. }
    44. //1 4
    45. //2 1
    46. //2 4
    47. //3 4
    48. //1 2
    49. //1 3
    50. //2 3

  • 相关阅读:
    idea启动tomcat报错404
    微服务-我对Spring Clound的理解
    binlog格式设置
    Redis中protected-mode模式详解
    C# BinaryFormatter序列化后的文件格式
    对话框如何屏蔽ok和cancel按键 2023/10/21 上午11:36:08
    Linux 基础入门 ——备份日志 -蓝桥云课( crontab命令)
    Spring Boot中的max-http-header-size配置
    项目中使用到的Spring注解及其作用
    【深度学习】浅显易懂的残差网络(Residual Network)
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/127967365