题目链接

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. K3Cloud单据转换获取源单数据

    private DynamicObject sourceBill = null;        object fid;        //获取源单数据(选单)        public overri ...

  2. asp.net C#生成和解析二维码代码

    类库文件我们在文件最后面下载 [ThoughtWorks.QRCode.dll 就是类库] 使用时需要增加: using ThoughtWorks.QRCode.Codec;using Thought ...

  3. html5的自定义data-*属性和jquery的data()方法的使用示例

    人们总喜欢往HTML标签上添加自定义属性来存储和操作数据. 但这样做的问题是,你不知道将来会不会有其它脚本把你的自定义属性给重置掉,此外,你这样做也会导致html语法上不符合Html规范,以及一些其它 ...

  4. 20150323--MVC

    MVC: Model view(视图层,模板) Control(控制层) 三层:数据访问,商业逻辑,用户界面(Webform,MVC). 服务端无状态:接受请求,返回页面,每次请求并返回界面,前后不是 ...

  5. MATLAB 生成 COM 步骤

    环境: 操作系统:windows xp sp3 MATLAB:Version 7.1.0.246(R14) Service Pack 3 第一步:安装编译器(如果已经安装则可跳过此步) 在MATLAB ...

  6. linux网络编程中阻塞和非阻塞socket的区别

    读操作 对于阻塞的socket,当socket的接收缓冲区中没有数据时,read调用会一直阻塞住,直到有数据到来才返 回.当socket缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数.当 ...

  7. ●linux进程的查看与操作●

    查看进程:ps -le | more ,ps -aux | more ,ps & 后台运行  jobs 查看后台进程  fg [n]调到前台  bg放到后台 ctrl +c 终止  ctrl ...

  8. IDEA笔记

    快捷键: 查找类:ctrl + shif + R (eclipse)查找文件:double shift查找文件中的变量名和方法:ctrl + H (eclipse)system.out:输入 sout ...

  9. 浅析IList与List的区别

    List和IList是.net开发中经常遇到的两种类型,用法上经常会让初学者摸不到头脑,下面简要的分析一下这两种类型的区别 1.IList<T>是接口,继承自ICollection< ...

  10. LAMP开发之环境搭建(2014.12.7在ubuntu下)

    Ubuntu下搭建LAMP环境 前言:学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我搭建的是LAMP环境,即Linux.Apache ...