这个题目是这样的。

给你三个字符串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. 20155229 实验一《Java开发环境的熟悉》实验报告

    20155229 实验一<Java开发环境的熟悉>实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Idea 编辑.编译.运行.调试Java程序. 实验步骤 (一) ...

  2. 20155333 2016-2017-2 《Java程序设计》第三周学习总结

    20155333 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 第四章 类定义时使用class关键词,名称使用Clothes,建立实例要使用new关键词. ...

  3. 20145226夏艺华 《Java程序设计》实验报告四

    实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试 了解Android组件.布局管理器的使用 掌握Android中事件处理机制 Andro ...

  4. 【HEOI2016】排序

    题面 题解 这题好神仙啊... 我们二分这个位置上的数, 然后当\(val[i] \geq mid\)的位置设为\(1\),否则为\(0\) 这样一来,这道题就变成了一个\(01\)序列排序,所以就可 ...

  5. wpf TabControl控件的SelectionChanged方法

    对于老手来说很简单,但是新手我从百度上找了好久没找到,最后还是去谷歌找到的,哎,万能的google. 前端界面: <TabControl Margin="0,10,0,0" ...

  6. bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏)

    bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏) 据说正解是并查集???我不会 这不是一道匈♂牙利好题吗??? 一个装备的两个属性都向它连边,然后跑一遍匈♂牙利 注意: ...

  7. 详解UML图之类图

    产品经理的必备技能之一是画UML图,本文就告诉你怎么画标准的类图吧.本文结合网络资料和个人心得所成,不当之处,请多指教. 1.为什么需要类图?类图的作用 我们做项目的需求分析,最开始往往得到的是一堆文 ...

  8. 【C#利用后台动态加载数据】Winform“防界面卡死”【BackgroundWorker】类

    using System.ComponentModel 直接使用EgProgressBar方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  9. python接口自动化1-发送get请求 前言

    前言 requests模块,也就是老污龟,为啥叫它老污龟呢,因为这个官网上的logo就是这只污龟,接下来就是学习它了. 一.环境安装 1.用pip安装requests模块 >>pip in ...

  10. thinkphp5登录并保存session、根据不同用户权限跳转不同页面

    本文讲述如何在thinkphp5中完成登录并保存session.然后根据不同的用户权限跳转相应页面功能的实现.我也在学习thinkphp源码的路上,记录一下并与大家分享.完成该步骤主要有以下三个步骤完 ...