题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=4681

题意:

给你a,b,c三个串,构造一个d串使得d是a,b的子序列,并且c是d的连续子串。求d最大的长度。

题解:

枚举a,b串开始匹配c的位置,(结束的位置可以贪心出来),然后前后都用最长公共子序列来跑就可以了。

O(n^2)预处理,O(n^2)枚举。

#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std; typedef long long LL;
const int maxn = ; char sa[maxn], sb[maxn], sc[maxn];
int dp1[maxn][maxn], dp2[maxn][maxn]; int pa[maxn], pb[maxn];
void get_p(char* ss, int* pp) {
memset(pp, -, sizeof(int)*maxn); int lss = strlen(ss),lsc=strlen(sc);
for (int i = ; i < lss; i++) {
int k = ,j;
for (j = i; j < lss; j++) {
if (k == lsc) break;
if (sc[k] == ss[j]) {
k++;
}
}
if (k == lsc){
pp[i] = j - ;
}
}
} void init() {
memset(dp1, , sizeof(dp1));
memset(dp2, , sizeof(dp2));
} int main() {
int tc,kase=;
scanf("%d", &tc);
while (tc--) {
init();
scanf("%s%s%s", sa, sb, sc);
get_p(sa, pa), get_p(sb, pb);
int la = strlen(sa), lb = strlen(sb),lc=strlen(sc);
for (int i = ; i < la; i++) {
for (int j = ; j < lb; j++) {
if (sa[i] == sb[j]) {
dp1[i][j] = max(dp1[i][j], i>&&j>?dp1[i - ][j - ]+:);
}
dp1[i][j] = max(dp1[i][j], i>?dp1[i - ][j]:);
dp1[i][j] = max(dp1[i][j], j > ? dp1[i][j - ] : );
}
}
for (int i = la-; i >= ; i--) {
for (int j = lb - ; j >= ; j--) {
if (sa[i] == sb[j]) {
dp2[i][j] = max(dp2[i][j], dp2[i + ][j + ] + );
}
dp2[i][j] = max(dp2[i][j], dp2[i + ][j]);
dp2[i][j] = max(dp2[i][j], dp2[i][j + ]);
}
}
int ans = ;
for (int i = ; i < la - ; i++) {
for (int j = ; j < lb - ; j++) {
if (pa[i] != - && pb[j] != -) { int lef = i > && j > ? dp1[i - ][j - ] : ;
int rig = pa[i] < la - && pb[j] < lb - ? dp2[pa[i] + ][pb[j] + ] : ;
ans = max(ans, lef + lc + rig);
}
}
}
printf("Case #%d: %d\n",++kase, ans);
}
return ;
}

HDU 4681 String 最长公共子序列的更多相关文章

  1. HDU 1159.Common Subsequence-最长公共子序列(LCS)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  2. hdu 1159求最长公共子序列

    题目描述:给出两个字符串,求两个字符串的公共子序列(不是公共子串,不要求连续,但要符合在原字符串中的顺序) in: abcfbc abfcab programming contest abcd mnp ...

  3. HDU 1159 LCS最长公共子序列

    #include <cstdio> #include <cstring> using namespace std; ; #define max(a,b) a>b?a:b ...

  4. HDU 4681 string 求最长公共子序列的简单DP+暴力枚举

    先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍. 再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束 将这些起始位 ...

  5. HDU 1159 Common Subsequence:LCS(最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 题意: 求最长公共子序列. 题解: (LCS模板题) 表示状态: dp[i][j] = max ...

  6. hdu 1159 Common Subsequence(最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...

  7. 最长公共子序列(加强版) Hdu 1503 Advanced Fruits

    Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. HDU 1513 Palindrome(最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 解题报告:给定一个长度为n的字符串,在这个字符串中插入最少的字符使得这个字符串成为回文串,求这个 ...

  9. hdu 1159 Common Subsequence(LCS最长公共子序列)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

随机推荐

  1. Pure-ftpd无法连接到服务器 425错误

    今天是五一假期的前一天,闲来没事,打开自己的博客,发现很久没有备份数据了,由于工作方面的原因,自己慢慢的退出了技术界,但本人还是依然向往技术界啊!各位技术宅们,加油! 问题发现 当我打开FTP客户端软 ...

  2. 零基础Android学习笔记-03 窗口间的数据传递

    1.通过全局变量来传递. 新建一个全局的类继承于Application package com.example.helloworld; import android.app.Application; ...

  3. Cisco基本命令配置

    实验一 路由器的基本命令操作 1 实验目标 ü 熟悉路由器的命令行操作 ü 能够使用命令行帮助 ü 能够查看路由器接口信息 ü 能够产看路由器配置信息 ü 能够配置以太网接口 ü 能够配置广域网接口 ...

  4. C# JSON 序列化和反序列化——JavaScriptSerializer实现

    一. JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.您无法访问序列化程序的此实例.但是,此类公开了公共 API.因此, ...

  5. 读书笔记-UIView与控件

    1.UIView 在Objective-C中,NSObject是所有类的“根”类.同样,在UIKit框架中,也存在一个如此神奇的类UIView.从继承关系上看,UIView是所有视图的根. 1.1.U ...

  6. dicom格式文件 界定标识符的处理

    转自:http://www.cnblogs.com/assassinx/archive/2013/05/18/3084854.html 说到底无非几个事情 :1传输语法确定 2数据元素读取 3 7fe ...

  7. Codevs 2875 RY哥查字典

    时间限制: 1 s  空间限制: 16000 KB  题目等级 : 钻石 Diamond  题目描述 Description RY哥最近新买了一本字典,他十分高兴,因为这上面的单词都十分的和谐,他天天 ...

  8. js生成 1-100 不重复随机数

    var count=100; var a=new Array(); for(var i=0;i<100;i++){ a[i]=i+1; } a.sort(function(){ return 0 ...

  9. zedboard 驱动理解

    1 驱动程序的编写   驱动是LINUX开发的必经之路,应用层对底层的调用经过了库与内核,内核下面才是驱动层,当你在应用程序执行对底层的控制时,驱动程序为你的控制提供了接口,或者说是策略. #incl ...

  10. Bootstrap轮播(carousel)插件中图片变形的终极解决方案——使用jqthumb.js

    在顶求网的首页中我使用了BootStrap的轮播(carousel)插件来展示文章中的图片.我在程序中自动抓取文章的第一张图片作为该轮播控件中要显示的图片,由于文章的图片大小不一,而轮播插件的大小基本 ...