HDU 4681 String 最长公共子序列
题目链接
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 最长公共子序列的更多相关文章
- HDU 1159.Common Subsequence-最长公共子序列(LCS)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 1159求最长公共子序列
题目描述:给出两个字符串,求两个字符串的公共子序列(不是公共子串,不要求连续,但要符合在原字符串中的顺序) in: abcfbc abfcab programming contest abcd mnp ...
- HDU 1159 LCS最长公共子序列
#include <cstdio> #include <cstring> using namespace std; ; #define max(a,b) a>b?a:b ...
- HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍. 再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束 将这些起始位 ...
- HDU 1159 Common Subsequence:LCS(最长公共子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 题意: 求最长公共子序列. 题解: (LCS模板题) 表示状态: dp[i][j] = max ...
- hdu 1159 Common Subsequence(最长公共子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...
- 最长公共子序列(加强版) Hdu 1503 Advanced Fruits
Advanced Fruits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- HDU 1513 Palindrome(最长公共子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 解题报告:给定一个长度为n的字符串,在这个字符串中插入最少的字符使得这个字符串成为回文串,求这个 ...
- hdu 1159 Common Subsequence(LCS最长公共子序列)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- ASP.NET XML与JSON
第一章 ASP.NET XML与JSON 本章学习目标:主要理解DOM和XML,掌握.NET操作XML,DOM,理解json对象,并掌握ASP.NET中JSON的序列化和反序列化. 下面是ASP.N ...
- shell获取本地ip的三种方法
第一种方法:ifconfig|grep inet |awk '{print $2}'|sed '2d'|awk -F : '{print $2}'第二种方法:ifconfig|grep inet|se ...
- ubuntu tty 永久修改中文环境为英文
以下代码只针对当前用户tty1有效, 对我来说足够了 vim ~/.bashrc 加入如下代码 if [ "$(tty)" = "/dev/tty1" ]; t ...
- FMS服务器在centos下安装
首先当然得先下载安装包了 http://pan.baidu.com/s/1jGL1Nvw #要先安装一下这个包,否则会提收提示错误,缺少libcap yum install compat-libcap ...
- 推荐最近使用的一个APP
最近使用一个APP叫做得到,觉得很不错,将一些很好的思想提炼出来,然后语音表达,放松眼睛,聆听收获.
- Linux C 程序 信号及信号的处理(19)
信号及信号的处理 1.Linux信号的介绍 信号是一种软件中断.Linux系统中根据POSIX标准扩展的信号机制. 1.信号来源 1.硬件方式 1.当用户按下某个键, ...
- seajs构建方法
标准构建 如果项目遵循推荐的标准目录结构: foo-module/ |-- dist //存放构建好的文件 |-- src ...
- nginx作反向代理,实现负载均衡
nginx作反向代理,实现负载均衡按正常的方法安装好 ngixn,方法可参考http://www.cnblogs.com/lin3615/p/4376224.html其中作了反向代理的服务器的配置如下 ...
- 版本控制器 (Svn,Git)
Svn: 集中式版本控制器,首先开发者在开始新一天的工作之前必须从服务器获取代码,然后进入自己的分支开发,开发完成后把自己的分支合并到主分支上进行提交,解决冲突.所有的版本信息都放在服务器上.如果脱离 ...
- phpcms v9 源码解析(3)pc_base::creat_app()
69 return self::load_sys_classs('application'); 在前面我们已经知道了,这个load_sys_classs 静态方法,它加载了P ...