这个题目是这样的。

给你三个字符串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中匹配的开始位置即可。

#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 1015
using namespace std; int f1[maxn][maxn],f2[maxn][maxn],pos1[maxn],pos2[maxn],L1,L2,L,ans,cas=,t;
char s1[maxn],s2[maxn],s[maxn]; int main()
{
scanf("%d",&t);
while (t--)
{
memset(f1,,sizeof f1);
memset(f2,,sizeof f2);
memset(s,,sizeof s);
memset(pos1,,sizeof pos1);
memset(pos2,,sizeof pos2);
memset(s1,,sizeof s1);
memset(s2,,sizeof s2);
scanf("%s",s1+);scanf("%s",s2+);scanf("%s",s+);
L1=strlen(s1+),L2=strlen(s2+),L=strlen(s+);
for (int i=; s1[i]; i++)
for (int j=; s2[j]; j++)
{
f1[i][j]=max(f1[i-][j],f1[i][j-]);
if (s1[i]==s2[j])
f1[i][j]=max(f1[i][j],f1[i-][j-]+);
}
f2[L1+][L2]=f2[L1][L2+]=f2[L1+][L2+]=;
for (int i=L1; i>; i--)
for (int j=L2; j>; j--)
{
f2[i][j]=max(f2[i+][j],f2[i][j+]);
if (s1[i]==s2[j])
f2[i][j]=max(f2[i][j],f2[i+][j+]+);
}
for (int i=; s1[i]; i++)
{
if (s1[i]!=s[])
{
pos1[i]=;
continue;
}
int cur=,j=i;
for (; s1[j]; j++)
{
if (s1[j]==s[cur]) cur++;
if (!s[cur]) break;
}
if (!s[cur]) pos1[i]=j;
else pos1[i]=;
}
for (int i=; s2[i]; i++)
{
if (s2[i]!=s[])
{
pos2[i]=;
continue;
}
int cur=,j=i;
for (;s2[j]; j++)
{
if (s2[j]==s[cur]) cur++;
if (!s[cur]) break;
}
if (!s[cur]) pos2[i]=j;
else pos2[i]=;
}
ans=L;
for (int i=; s1[i]; i++)
{
if (pos1[i]==) continue;
for (int j=; s2[j]; j++)
{
if (pos2[j]==) continue;
ans=max(ans,L+f1[i-][j-]+f2[pos1[i]+][pos2[j]+]);
}
}
printf("Case #%d: %d\n",++cas,ans);
}
return ;
}

最新文章

  1. 当GitHub把我当成DDos攻击者拉进了黑名单中。。。
  2. python之很好的网站
  3. Zookeeper安装指南
  4. Hadoop Mac OSX 安装笔记
  5. HtmlParser + HttpClient 实现爬虫
  6. (原创)fedora 17安装KVM虚拟机
  7. swift学习笔记(六)析关闭过程和使用分配给属性的默认值
  8. 协议系列之TCP/IP协议
  9. 用python开发调试器——起始篇
  10. 新加坡100M带宽,国内延迟70ms,仅800元
  11. input type = file 在部分安卓手机上无法调起摄像头和相册
  12. idea 通过命令操作git
  13. Jaxb 完全手册
  14. ring3下的IAT HOOK
  15. js-ES6学习笔记-编程风格(1)
  16. gcc gdb调试 &amp; 命令行带参 (一) ******
  17. Ubuntu16安装QQ
  18. React-Native 之 环境配置和简单使用
  19. cocos2d-x游戏引擎核心之四——动作调度机制
  20. [BZOJ4825][HNOI2017]单旋(线段树+Splay)

热门文章

  1. banwagon vps装wordpress
  2. Ubuntu + apache + Mysql +php
  3. 【转载】D3DXVec3TransformNormal and D3DXVec3TransformCoord
  4. 【BZOJ4803】逆欧拉函数
  5. 1722: [Usaco2006 Mar] Milk Team Select 产奶比赛
  6. DSP5509项目之用FFT识别钢琴音调(5)之开始傅里叶变换
  7. Spring学习(十三)-----Spring 表达式语言(Spring EL)
  8. 原生android(二)——认识activity
  9. Selenium2+python自动化-操作浏览器基本方法
  10. Appium+python 自动发送邮件(2)(转)