这个题目是这样的。

给你三个字符串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. 实验楼学习linux第一章第四节linux目录结构及文件基本操作

    linux目录结构及文件基本操作 常用命令 切换目录 cd 当前目录 . 上一级目录 .. (.和..开头的都是隐藏文件) 查看隐藏文件 ls -a 上一级所在目录 - 当前用户home目录 ~ 获取 ...

  2. Unity LineRenderer制作画版

    Source: using System.Collections; using System.Collections.Generic; using UnityEngine; public class ...

  3. Python中的矩阵操作

    Numpy 通过观察Python的自有数据类型,我们可以发现Python原生并不提供多维数组的操作,那么为了处理矩阵,就需要使用第三方提供的相关的包. NumPy 是一个非常优秀的提供矩阵操作的包.N ...

  4. Selenium2+python自动化-操作浏览器基本方法

    前言 从这篇开始,正式学习selenium的webdriver框架.我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可视化工具,我们要学的是webdriver框架的A ...

  5. eclipse集成testng插件(离线安装方式)

    testng是一个优秀的测试框架,我们在开发自动化测试脚本或者框架的时候经常会用到这个框架,因为它不仅能方便的帮助我们管理测试类,而且它还提供了丰富的注解来支持各种测试场景的实现(参数化,数据提供者, ...

  6. TPO 02 - Early Cinema

    TPO 02 - Early Cinema NOTE: 主要意思(大概就是主谓宾)用粗体标出:重要的其它用斜体: []中的是大致意思,可能与原文有关也可能无关,但不会离题 目的为训练句子/段落总结能力 ...

  7. Tomcat源码学习(2)——启动过程分析

    Tomcat启动过程分析 启动 tomcat 时,Windows下执行 startup.bat :Linux下执行 startup.sh 文件,实际上最后都是调用 org.apache.catalin ...

  8. kubeadm构建k8s之Prometheus-operated监控(0.18.1)

    介绍: 大家好,k8s的搭建有许多方式,也有许多快速部署的,为了简化部署的复杂度,官方也提供了开源的kubeadm快速部署,最新1.10.x版本已经可以实现部署集群, 如果你对k8s的原理已经非常了解 ...

  9. 在Office 365 的如何给管理员赋予查看所有人邮箱的权限的Powershell

    连接至Office365 的Powershell Get-MsolUser -UserPrincipalName admin@***.partner.onmschina.cn //Get-MsolUs ...

  10. Seven super tips for successful selling on Amazon

    Check for orders daily: To ship quickly you need to find out about orders promptly. We will e-mail y ...