这个题目是这样的。

给你三个字符串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 ;
}

HDU4681_String的更多相关文章

随机推荐

  1. 20155301 2016-2017-2 《Java程序设计》第4周学习总结

    20155301 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 1.关键词extends,表示SwordsMan会扩充Role的行为,然后再扩充Role原本 ...

  2. 在SQL SERVER中批量替换字符串的方法

    UPDATE MainData SET Content = )) , 'XM00000137' , 'XM00000078') WHERE [Key] IN (SELECT md_key FROM i ...

  3. day6 RHCE

    17.创建一个脚本 在server0上创建一个名为/root/foo.sh的脚本,让其提供下列特性: 当运行/root/foo.sh redhat,输出fedora 当运行/root/foo.sh f ...

  4. 【CF527C】Glass Carving

    [CF527C]Glass Carving 题面 洛谷 题解 因为横着切与纵切无关 所以开\(set\)维护横着的最大值和纵着的最大值即可 #include <iostream> #inc ...

  5. rsync + inotify 数据实时同步

    一.rsync介绍 rsync英文全称为Remote synchronization,从软件的名称就可以看出来,Rsync具有可是本地和远程两台主机之间的数据快速复制同步镜像.远程备份的功能,这个功能 ...

  6. Nginx入门篇(三)之虚拟主机配置

    一.虚拟主机概念 所谓虚拟主机,在Web服务当中就是一个独立的网站站点,这个站点对应独立的域名(也有可能是IP或者端口),具有独立的程序和资源目录,可以独立地对外提供服务供用户访问. 这个独立的站点在 ...

  7. Flask开发环境搭建

    基础准备 Python 3.6.5 Conda Visual Studio Code 虚拟环境 创建虚拟环境 conda create -n flask 激活虚拟环境 activate flask 关 ...

  8. APP端测试,常见功能测试点汇总

    除去每个产品和版本不同的业务需求以及功能,针对于大多数的APP的共同点和移动设备的特性,本文总结了一些APP功能测试中经常遇见,需要考虑到的测试点以共参考 一.安装和卸载 应用的安装和卸载在任何一款A ...

  9. Scala基础知识笔记1

    上一篇文章介绍了如何下载scala, 因为在官网上点击下载按钮无法下载, 下面介绍scala的基础语法: 1 scala和java的关系 Scala是基于jvm的一门编程语言,Scala的代码最终会经 ...

  10. 高可用Kubernetes集群-7. 部署kube-controller-manager

    九.部署kube-controller-manager kube-controller-manager是Kube-Master相关的3个服务之一,是有状态的服务,会修改集群的状态信息. 如果多个mas ...