hdu 4681 String(转载)
#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(转载)的更多相关文章
- HDU 4681 String 最长公共子序列
		题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4681 题意: 给你a,b,c三个串,构造一个d串使得d是a,b的子序列,并且c是d的连续子串.求d最大 ... 
- hdu 4681 string
		字符串DP 题意:给你三个字符串a,b,c求字符串d的长度. 字符串d满足的要求:是a和b的公共子序列,c是它的子串. 定义dp1[i][j]表示a的第 i 位与b的第 j 位之前相同的子序列长度(包 ... 
- HDU 4681 String(2013多校8 1006题 DP)
		String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Subm ... 
- HDU 4681 STRING dp+暴力。
		题意:不说了很好懂. 这题这么水= =...当时竟然没有勇气暴力搜一下.昨天(好吧前天.)比赛的时候胃疼,看到这题想了一个办法就是对每一个出现最短的C串前后连接然后对这个串求最长公共子序列.其实优化一 ... 
- HDU 4681 String(DP)
		题目链接 枚举A和B中每一段含有C的段,A的前面 后面和B前面后面,求最长公共子序.观察发现,可以预处理最长公共子序. #include <iostream> #include <c ... 
- HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
		先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍. 再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束 将这些起始位 ... 
- HDU 4681 String 胡搞
		设串C的第一个字母在串A中出现的位置是stA, 串C的最后一个字母在串A中出现的位置是edA. 设串C的第一个字母在串B中出现的位置是stB, 串C的最后一个字母在串B中出现的位置是edB. 求出每一 ... 
- HDU 3374 String Problem (KMP+最大最小表示)
		HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others) Memory ... 
- Hdu 4681 2013 Multi-University Training Contest 8 String
		带跨越式的LCS,同样是在朴素的LCS上加入一种跨越一段的转移,这样我们要预处理出跨越一段给定串的转移函数. 这个题同样可以正反两边LCS做 呆马: #include <iostream> ... 
随机推荐
- 十八、python沉淀之路--生成器
			一.生成器 生成器总结:语法上和函数类似:生成器函数和常规函数几乎是一样的.他们都是使用def语句进行定义,差别在于生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值.自动实 ... 
- 开源的UML建模工具
			StarUML 一个开源的UML建模工具 地址:http://staruml.sourceforge.net/en/ 效果图: 出处:http://www.cnblogs.com/zzy0471/ar ... 
- vuejs angularjs 框架的一些比较(vue项目重构四)
			使用Angularjs和Vue.js对比 首先需要说明的是:现在默认angularjs指angular1.0+版本,angular默认指2.0以上版本.本文的名词也默认指定angular的1.0+版本 ... 
- git 基本操作   https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000
			1.创建版本库 (即仓库 repository)简单理解为一个目录,这个目录里的所有文件都可以被git管理起来,每个文件的修改删除,git都能跟踪,一边任何时刻都可以追踪历史,或者在将来某个时刻可以 ... 
- (转)使用PowerDesigner生成HTML功能
			本文转载自:http://www.cnblogs.com/CowboyProgrammer/archive/2009/04/28/1445423.html 使用PowerDesigner设计数据库关系 ... 
- (转)winform下TCP通信的简单应用
			本文转载自:http://blog.csdn.net/wanlong360599336/article/details/7557064 先看效果图: TCP比较繁琐的就是三次握手定理,每次再发送数据前 ... 
- 3 SpringBoot与微服务
			SpringBoot的使用? 化繁为简: Spring MVC 需要定义各种配置,配置文件多. SpringBoot的核心功能? 独立运行: java -jar XXX.jar (以前启动SPring ... 
- python ftp 上传
			#!/usr/bin/python # -*-coding:utf- -*- from ftplib import FTP def ftpconnect(host,username,password) ... 
- wordpress 学习笔记
			(1) __()函数 function __( $text, $domain = 'default' ) { return translate( $text, $domain ); } 返回一个字符串 ... 
- List扩展方法汇总(仅备注)
			不管在c/s还是b/s的c#语言开发程序中,经常会用到List的扩展方法,尤其在json格式的数据和服务端交互越来越流行,很多时候总是在开发使用到的时候才去搜索有些扩展方法或者linq的用法,在这里, ... 
