题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681

题目大意:给定三个字符串A,B,C 求最长的串D,要求(1)D是A的字序列 (2)D是B的子序列 (3)C是D的连续子序列

Sample Input
2
aaaaa
aaaa
aa
abcdef
acebdf
cf
 
Sample Output
Case #1: 4
Case #2: 3
 
Hint

For test one, D is "aaaa", and for test two, D is "acf".

分析:求A和B的LCS,正反各求一次得到dp1和dp2,然后枚举C在A,B中的起始位置和终止位置,答案为

  max { dp1[C在A中起始位置][C在B中起始位置] + dp2[C在A中终止位置][C在D中终止位置]+C的长度 }

代码如下:

 # include<cstdio>
# include<cstring>
# include<iostream>
using namespace std;
# define MAXN
char s1[MAXN],s2[MAXN],s3[MAXN];
int dp1[MAXN][MAXN],dp2[MAXN][MAXN];//dp1[][]表示字符串A,B从前往后的最大公共子串,dp2[][]表示字符串A,B从后往前的最大公共子串
int len1,len2,len3;
int loc11[MAXN],loc12[MAXN],loc21[MAXN],loc22[MAXN];//loc11,loc12表示C在A中起始、终止位置;loc21,loc22表示C在B中起始、终止位置 int solve(char *str,int len,int loc1[],int loc2[])
{
int i,j,k;
int cnt = ;
for(i=; i<=len; i++)
{
if(str[i] == s3[])
{
for(j=i,k=; j<=len&&k<=len3; j++)
if(str[j]==s3[k])
k++;
if(k != len3+)
break;
loc1[cnt] = i;
loc2[cnt] = j-;
cnt++;
}
}
return cnt;
}
int main()
{
int i,j;
int cas,T;
scanf("%d",&T);
for(cas=; cas<=T; cas++)
{
scanf("%s%s%s",s1+,s2+,s3+);
len1 = strlen(s1+);
len2 = strlen(s2+);
len3 = strlen(s3+); memset(dp1,,sizeof(dp1));
for(i=; i<=len1; i++)
for(j=; j<=len2; j++)
{
if(s1[i] == s2[j])
dp1[i][j] = dp1[i-][j-] + ; else
dp1[i][j] = max(dp1[i-][j], dp1[i][j-]);
} memset(dp2,,sizeof(dp2));
for(i=len1; i>=; i--)
for(j=len2; j>=; j--)
{
if(s1[i] == s2[j])
dp2[i][j] = dp2[i+][j+] + ;
else
dp2[i][j] = max(dp2[i+][j], dp2[i][j+]);
} int x=solve(s1,len1,loc11,loc12);
int y=solve(s2,len2,loc21,loc22);
int ans=;
for(i=; i<x; i++)
for(j=; j<y; j++)
ans = max(ans, dp1[loc11[i]-][loc21[j]-] + dp2[loc12[i]+][loc22[j]+]);
printf("Case #%d: %d\n",cas,ans+len3);
}
return ;
}

HUST 4681 String (DP LCS变形)的更多相关文章

  1. UVA-1625-Color Length(DP LCS变形)

    Color Length(UVA-1625)(DP LCS变形) 题目大意 输入两个长度分别为n,m(<5000)的颜色序列.要求按顺序合成同一个序列,即每次可以把一个序列开头的颜色放到新序列的 ...

  2. poj1080--Human Gene Functions(dp:LCS变形)

    Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17206   Accepted:  ...

  3. UVA1625Color Lenth(DP+LCS变形 未AC)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/C 紫书P276 res[i][j]表示第一个序列移动i个,第 ...

  4. HDU 4681 STRING dp+暴力。

    题意:不说了很好懂. 这题这么水= =...当时竟然没有勇气暴力搜一下.昨天(好吧前天.)比赛的时候胃疼,看到这题想了一个办法就是对每一个出现最短的C串前后连接然后对这个串求最长公共子序列.其实优化一 ...

  5. uva 10453 dp/LCS变形

    https://vjudge.net/problem/UVA-10453 给出一个字符串,问最少添加几个字符使其变为回文串,并输出任意一种答案.就是一个类似于LCS的题目,而且简化了一下,只会出现三种 ...

  6. HDU 4681 String(DP)

    题目链接 枚举A和B中每一段含有C的段,A的前面 后面和B前面后面,求最长公共子序.观察发现,可以预处理最长公共子序. #include <iostream> #include <c ...

  7. poj 1080 (LCS变形)

    Human Gene Functions 题意: LCS: 设dp[i][j]为前i,j的最长公共序列长度: dp[i][j] = dp[i-1][j-1]+1;(a[i] == b[j]) dp[i ...

  8. POJ 1080( LCS变形)

    题目链接: http://poj.org/problem?id=1080 Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K ...

  9. UVA.10192 Vacation (DP LCS)

    UVA.10192 Vacation (DP LCS) 题意分析 某人要指定旅游路线,父母分别给出了一系列城市的旅游顺序,求满足父母建议的最大的城市数量是多少. 对于父母的建议分别作为2个子串,对其做 ...

随机推荐

  1. Linux系统下如何修改主机名

    vi /etc/sysconfig/network vi /etc/hosts sudo hostname

  2. hdoj 3952 World Exhibition

    World Exhibition Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. linux内核--内核内存管理

    如题目所示,为什么要称作“内核内存管理”,因为内核所需要的内存和用户态所需要的内存,这两者在管理上是不一样的. 这篇文章描述内核的内存管理,用户态的内存管理在以后的文章中讲述. 首先简单的说明一下下面 ...

  4. OGG 单表初始化操作步骤

    有时候ogg两端数据不一致,且数据量较大,手工修改比较复杂的情况下,我们需要对这些表进行初始化.初始化的大概思路是: 1. 停止两端OGG 2. 如果业务不可以停很长时间,就需要配置目标端进程,暂停这 ...

  5. Android-用webservice连接sqlserver数据库

    以前做的东西,只要用数据库的都是在项目里自己重新做一份数据.但是这种方法是很不可取的,首先,手机内存不会很大,把数据表建在项目里无疑又增大了程序.这样一来手机的运行速度可想而知.其次,数据大的时候还是 ...

  6. PowerMock注解PowerMockIgnore的使用方法

    故事要从一个异常开始,某天我在开发一个加密.解密特性,算法使用的是3DES,样例代码如下. package org.jackie.study.powermock; import java.io.Uns ...

  7. Centos安装成功mysql-5.5.37

    摘自http://www.2cto.com/os/201404/296364.html(原文请关注) 这几天在centos下装mysql,这里记录一下安装的过程,方便以后查阅 Mysql5.5.37安 ...

  8. Redis实战之Redis + Jedis[转]

    http://blog.csdn.net/it_man/article/details/9730605 2013-08-03 11:01 1786人阅读 评论(0) 收藏 举报   目录(?)[-] ...

  9. Unity Panel open & close

    Making a Popup and Closable Panel in Unity 5 script: public GameObject thePanel; public open() { the ...

  10. GetTickCount() 函数的作用和用法

    今天项目中60秒倒计时模块需要用到GetTickCount(),这个函数,在此做下整理和总结. 1.定义 For Release configurations, this function retur ...