HDU4681_String
这个题目是这样的。
给你三个字符串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的更多相关文章
随机推荐
- 罗佳琪的第三次预备作业——虚拟机的安装及Linux的初步学习
虚拟机的安装及Linux的初步学习 坎坷的安装过程 首先我按照老师给的基于VirtualBox虚拟机安装Ubuntu图文教程进行了下载,下载很顺利但是安装时出现了问题. 起初我以为是电脑位数问题,但我 ...
- ConfigurationManager 读写AppSettings键值对
using System; using System.Configuration; namespace ConsoleApplication1 { class Program { static voi ...
- a data verification error occurred, file load failed
1. 调试创龙DSP6748的时候,下载.out文件出现这个错误 2. 换了其他板子,还有其他仿真器也不行,最后发现是没加载GEL文件
- LAUNCHXL-28379D入门学习-第一篇
1. 首先安装controlSUITE或者C2000ware软件,TI官网下载,安装后包括C2000的函数库和例程之类的,还可以和CCS搭配使用.controlSUITE安装完之后大约4个G,所以我安 ...
- 质造未来,首届腾讯WeTest技术交流开放日成功举办
WeTest 导读 北京时间12月21日下午1点整,2018年度腾讯WeTest技术交流开放日在上海举办.盛大.巨人.电魂.bilibili.方趣等十余家来自不同优秀企业的测试技术负责人均来到现场,共 ...
- Javascript格式化并高亮xml字符串
Javascript格式化并高亮xml字符串 两个关键点 使用DOMParser解析xml 递归遍历xml树,按格式输出每一个节点 关于使用DOMParser 此方法目前在IE9以上和其它浏览器里都是 ...
- 在tomcat5中发布项目时,用IP地址+端口不能访问项目,而用localhost加端口时可以访问成功
最近在开发项目中,遇到的一个问题是: 在 tomcat中发布一个web项目,但是发布成功后,只能用http://localhost:8080/fm访问项目,不能用 http://127.0.0.1:8 ...
- 强化学习读书笔记 - 11 - off-policy的近似方法
强化学习读书笔记 - 11 - off-policy的近似方法 学习笔记: Reinforcement Learning: An Introduction, Richard S. Sutton and ...
- linux部署MantisBT(一)部署apache
一.部署apache 1.下载apache安装包及依赖包 http://httpd.apache.org/download.cgi#apache24(apache2)http://apr.apache ...
- 2.1 Oracle之DML的SQL语句之单表查询以及函数
1.SQL简介 对于不同的数据库来说,SQL语句是相通的,关系型数据库都以SQL语句为操作的标准,只是相应的数据库对应的函数不相同. SQL(Structured Query Language,结构化 ...