#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 1111
char a[maxn],b[maxn],c[maxn];
int dp1[maxn][maxn],dp2[maxn][maxn],n,m,len;
struct node//记录在字符串a,b中,c串的首尾位置
{
int x,y;
};
void lcs()//求最长公共子序列长
{
int i, j,k;
//从字符串左到右
for(i=;i<n;i++)
for(j=;j<m;j++)
if(a[i]==b[j])
dp1[i+][j+]=dp1[i][j]+;
else
dp1[i+][j+]=max(dp1[i][j+],dp1[i+][j]);
//从字符串右到左
for(i=n-;i>=;i--)
for(j=m-;j>=;j--)
if(a[i]==b[j])
dp2[i+][j+]=dp2[i+][j+]+;
else
dp2[i+][j+]=max(dp2[i+][j+],dp2[i+][j+]);
}
void find(char str[],int n,int &t,node e[])//找到c串在a,b中的首尾位置
{
int i,j,k;
for(i=;i<n;i++)
{
if(str[i]==c[])
{
for(j=i+,k=;j<n;j++)
{
if(str[j]==c[k])k++;
if(k==len)break;
}
if(k==len){e[t].x=i+;e[t++].y=j+;}
else break;
}
}
}
int main()
{
int T,tt=;
scanf("%d",&T);
while(T--)
{
memset(dp1,,sizeof(dp1));
memset(dp2,,sizeof(dp2));
int i,j,k;
scanf("%s%s%s",a,b,c);
n=strlen(a);
m=strlen(b);
len=strlen(c);
lcs();
int ans,num1,num2;
node e[maxn],f[maxn];
ans=num1=num2=;
find(a,n,num1,e);
find(b,m,num2,f);
for(i=;i<num1;i++)
for(j=;j<num2;j++)
ans=max(ans,dp1[e[i].x-][f[j].x-]+dp2[e[i].y+][f[j].y+]);
printf("Case #%d: %d\n",++tt,ans+len);
}
return ;
}
/*
先求出a,b的最长公共子序列,从开头和末尾开始的都要
其中dp1[i][j]表示a中第i个字符之前,b中第j个字符之前的最长公共子序列长
dp2[i][j]表示a中第i个字符之后,b中第j个字符之后的最长公共子序列长 用find找到a中所有c首尾所在位置,在首位置固定的情况下找到末位置最小的即可,因为更长的会使结果值较小,存在结构体重
同理找到b的 e[i].x,e[i].y,f[j].x,f[j].y
那么d最长为ans=max(ans,dp1[e[i].x-1][f[j].x-1]+dp2[e[i].y+1][f[j].y+1]+len),
就是说包含c的部分已经固定,只要加上之前和之后的最长公共子序列长就好了
*/

hdu 4681 String(转载)的更多相关文章

  1. HDU 4681 String 最长公共子序列

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4681 题意: 给你a,b,c三个串,构造一个d串使得d是a,b的子序列,并且c是d的连续子串.求d最大 ...

  2. hdu 4681 string

    字符串DP 题意:给你三个字符串a,b,c求字符串d的长度. 字符串d满足的要求:是a和b的公共子序列,c是它的子串. 定义dp1[i][j]表示a的第 i 位与b的第 j 位之前相同的子序列长度(包 ...

  3. HDU 4681 String(2013多校8 1006题 DP)

    String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Subm ...

  4. HDU 4681 STRING dp+暴力。

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

  5. HDU 4681 String(DP)

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

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

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

  7. HDU 4681 String 胡搞

    设串C的第一个字母在串A中出现的位置是stA, 串C的最后一个字母在串A中出现的位置是edA. 设串C的第一个字母在串B中出现的位置是stB, 串C的最后一个字母在串B中出现的位置是edB. 求出每一 ...

  8. HDU 3374 String Problem (KMP+最大最小表示)

    HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  9. Hdu 4681 2013 Multi-University Training Contest 8 String

    带跨越式的LCS,同样是在朴素的LCS上加入一种跨越一段的转移,这样我们要预处理出跨越一段给定串的转移函数. 这个题同样可以正反两边LCS做 呆马: #include <iostream> ...

随机推荐

  1. 1.1对java web开发的一点理解

    前言 Q:通常行内人士见面会问你,你做哪方面开发的? A:java web开发的 那么,什么是java web开发? java web开发通常是指java web应用程序的开发.一个B/S架构的 we ...

  2. #51单片机#蓝牙模块(ATK-SPP-HC06从机串口)的使用方法

    #include <AT89X51.H> #include <intrins.h> // 函数原形定义 #define uchar unsigned char #define ...

  3. Mybatis自动生成实体类、dao接口和mapping映射文件

    由于Mybatis是一种半自动的ORM框架,它的工作主要是配置mapping映射文件,为了减少手动书写映射文件,可以利用mybatis生成器,自动生成实体类.dao接口以及它的映射文件,然后直接拷贝到 ...

  4. Ctrl+H 浪潮Raid配置文档

    说明 本手册适用于LSI芯片Raid卡 包括但不限于Inspur 2008/2108 Raid卡.LSI 9240/9260/9261/9271 等Raid卡. 不同型号的Raid卡在某些功能上的支持 ...

  5. poj 3590 The shuffle Problem——DP+置换

    题目:http://poj.org/problem?id=3590 bzoj 1025 的弱化版.大概一样的 dp . 输出方案的时候小的环靠前.不用担心 dp 时用 > 还是 >= 来转 ...

  6. ajax同步异步

    test.html <a href="javascript:void(0)" onmouseover="testAsync()"> asy.js f ...

  7. emqtt 2 (我要连服务器)

    这一篇,主要分析下,client 是怎么 connect server的,以及成功connect server 之后,会做哪些事情,session是怎么 start的. 由protocol 开始 之前 ...

  8. OpenLiveWriter 这篇文章使用博客客户端撰写

    OpenLiveWriter是非常方便的博客客户端,起码相比在浏览器写博客多了一种选择.而且借助于MetaWeblog接口,可以很方便地同步博客文章到多个博客地址.本站cms.xlongwei.com ...

  9. 【转】在Linux下使用Jmeter执行测试任务

    想在Linux下运行jmeter必须先安装jdk,安装步骤如下: (1).下载一个linux可用的jdk包(比如:jdk-6u45-linux-i586.bin), (2).然后将jdk-6u45-l ...

  10. java二维数组求每行最大值,每列最小值,及输出数组主对角线上的元素

    总结:完全搞不懂,行和列是怎么弄的,,,,, package com.c2; import java.util.Scanner; public class Oaa { public static vo ...