这个题目是这样的。

给你三个字符串A,B,C,(C一定是A和B的一个公共子序列)。

现在要求你构造出一个串D,使得D同时为A和B的子序列,且C是D的一个连续子串。求D的最大可能长度。

很简单的一个DP题。

其实这个题目有三个预处理就可以搞定了。

1、f1[i][j]:A的前i个字符,B的前J个字符的最长公共子序列。

2、f2[i][j]:A的i个字符以后,B的第J个字符以后的字符的最长公共子序列。

3、A和B串以某个位置开始作为C的子序列时,最近的匹配距离(最近匹配完的那个地方)。

有了这三个预处理,剩下的只要直接暴力枚举A和B中匹配的开始位置即可。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #define maxn 1015
  5. using namespace std;
  6.  
  7. int f1[maxn][maxn],f2[maxn][maxn],pos1[maxn],pos2[maxn],L1,L2,L,ans,cas=,t;
  8. char s1[maxn],s2[maxn],s[maxn];
  9.  
  10. int main()
  11. {
  12. scanf("%d",&t);
  13. while (t--)
  14. {
  15. memset(f1,,sizeof f1);
  16. memset(f2,,sizeof f2);
  17. memset(s,,sizeof s);
  18. memset(pos1,,sizeof pos1);
  19. memset(pos2,,sizeof pos2);
  20. memset(s1,,sizeof s1);
  21. memset(s2,,sizeof s2);
  22. scanf("%s",s1+);scanf("%s",s2+);scanf("%s",s+);
  23. L1=strlen(s1+),L2=strlen(s2+),L=strlen(s+);
  24. for (int i=; s1[i]; i++)
  25. for (int j=; s2[j]; j++)
  26. {
  27. f1[i][j]=max(f1[i-][j],f1[i][j-]);
  28. if (s1[i]==s2[j])
  29. f1[i][j]=max(f1[i][j],f1[i-][j-]+);
  30. }
  31. f2[L1+][L2]=f2[L1][L2+]=f2[L1+][L2+]=;
  32. for (int i=L1; i>; i--)
  33. for (int j=L2; j>; j--)
  34. {
  35. f2[i][j]=max(f2[i+][j],f2[i][j+]);
  36. if (s1[i]==s2[j])
  37. f2[i][j]=max(f2[i][j],f2[i+][j+]+);
  38. }
  39. for (int i=; s1[i]; i++)
  40. {
  41. if (s1[i]!=s[])
  42. {
  43. pos1[i]=;
  44. continue;
  45. }
  46. int cur=,j=i;
  47. for (; s1[j]; j++)
  48. {
  49. if (s1[j]==s[cur]) cur++;
  50. if (!s[cur]) break;
  51. }
  52. if (!s[cur]) pos1[i]=j;
  53. else pos1[i]=;
  54. }
  55. for (int i=; s2[i]; i++)
  56. {
  57. if (s2[i]!=s[])
  58. {
  59. pos2[i]=;
  60. continue;
  61. }
  62. int cur=,j=i;
  63. for (;s2[j]; j++)
  64. {
  65. if (s2[j]==s[cur]) cur++;
  66. if (!s[cur]) break;
  67. }
  68. if (!s[cur]) pos2[i]=j;
  69. else pos2[i]=;
  70. }
  71. ans=L;
  72. for (int i=; s1[i]; i++)
  73. {
  74. if (pos1[i]==) continue;
  75. for (int j=; s2[j]; j++)
  76. {
  77. if (pos2[j]==) continue;
  78. ans=max(ans,L+f1[i-][j-]+f2[pos1[i]+][pos2[j]+]);
  79. }
  80. }
  81. printf("Case #%d: %d\n",++cas,ans);
  82. }
  83. return ;
  84. }

HDU4681_String的更多相关文章

随机推荐

  1. 20155234 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 (一)单元测试 ...

  2. 20155320 实验二 Java面向对象程序设计

    20155320 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...

  3. 【LG5021】[NOIP2018]赛道修建

    [LG5021][NOIP2018]赛道修建 题面 洛谷 题解 NOIP之前做过增强版还没做出来\(QAQ\) 一看到题目中的最大值最小,就很容易想到二分答案 重点是考虑如何\(check\) 设\( ...

  4. python 内置模块(hash lib)

    用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 MD5 import hashlib hash=h ...

  5. ADO.NET操作MySQL数据库

    前言 ADO.NET包括5大对象,分别是Connection.Command.DataReader.DataSet.DataAdapter,使用ADO.NET访问数据库有两个步骤:建立数据库连接.读取 ...

  6. Django之视图系统

    Django的View(视图) 一个视图函数(类),简称视图,是一个简单的python函数(类),它接受web请求并返回web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,或者 ...

  7. SpringBoot (1) idea下的环境搭建及demo

    1.Spring Boot简介 wiki上的介绍: Spring Boot是Spring的常规配置解决方案,用于创建可以“运行”的独立的,生产级的基于Spring的应用程序.[22]它预先配置了Spr ...

  8. Git之hotfix热修复分支

    1.假设你正在开发一个新功能, 需要新建一个new分支并切换: git checkout -b new 等价于 git branch new git checkout new 然后在这个new分支上已 ...

  9. leetcode个人题解——#40 Combination Sum2

    思路:解法和39题类似,改动了两处: 1.因为题目要求每个元素只能出现一次(不代表每个数只能有一个,因为数据中会有重复的数字),所以代码中21行搜索时下一次循环的位置+1: 2.将临时存放答案的vec ...

  10. 华为笔试——C++消重输出

    题目:消重输出 题目介绍: 输入一个正整数,给出消除重复数字以后最大的整数,注意需要考虑长整数. 例: 输入:988274320 输出:9874320 题目分析:这个结果的实现需要两个步骤:消重和排序 ...