HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍。
再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束
将这些起始位置先记录下来,然后枚举这些位置,最大的值输出,看一下代码,你就会顿悟了····哈哈。
贴代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1005
using namespace std;
char a[][N],b[N];//a[0]为串a,a[1]为串b,b为串c
int dp1[N][N],dp2[N][N];
int len[],num[];//len[2]为串c的长度
struct node
{
int s,e;
} p[][N];
void init()//dp顺序,逆序求一次最长公共子序列
{
for(int i=; i<=len[]+; ++i)
{
dp1[][i] = ;
dp2[len[]+][i]=;
}
for(int i=; i<=len[]+; ++i)
{
dp1[i][] = ;
dp2[i][len[]+] =;
}
for(int i=; i<=len[]; ++i)
{
for(int j=; j<=len[]; ++j)
{
if(a[][i] == a[][j] ) dp1[i][j] = dp1[i-][j-]+;
else dp1[i][j] = max(dp1[i-][j],dp1[i][j-]);
}
}
for(int i=len[]; i>=; --i)
{
for(int j=len[]; j>=; --j)
{
if(a[][i]==a[][j]) dp2[i][j]=dp2[i+][j+]+;
else dp2[i][j] = max(dp2[i+][j],dp2[i][j+]);
}
}
}
//从串中找一个包含c串的以c[0]为开始,以c[len-1]为结束的一段,记录下起始位置
int pipei(int ind,int start)
{
int i,j=;
for(i=start+; i<=len[ind]; ++i)
{
if(a[ind][i] == b[j]) ++j;
if(j==len[]) break;
}
if(j <len[]) return -;
else return i;
}
//预处理出a串和b串中所有如上所述的子串的起始位置
void yumeiju(int ind)
{
num[ind] = ;
for(int i=; i<=len[ind]; ++i)
{
if(a[ind][i] == b[])
{
int e = pipei(ind,i);
if(e == -) continue;
p[ind][num[ind]].s=i;
p[ind][num[ind]].e = e;
++num[ind];
}
}
}
//枚举所有的可能,求解
int meiju()
{
init();
yumeiju();
yumeiju();
int ans=;
for(int i=; i<num[]; ++i)
{
for(int j=; j<num[]; ++j)
{
if(dp1[p[][i].s-][p[][j].s-] + dp2[p[][i].e+][p[][j].e+] > ans)
ans = dp1[p[][i].s-][p[][j].s-] + dp2[p[][i].e+][p[][j].e+] ;
}
}
return ans +len[];
}
int main()
{
// freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
a[][]='#';
a[][] ='#';
for(int ser =; ser<=t; ++ser)
{
scanf("%s%s%s",a[]+,a[]+,b);
len[]= strlen(a[])-;
len[] = strlen(a[])-;
len[] = strlen(b);
printf("Case #%d: %d\n",ser,meiju());
}
return ;
}
HDU 4681 string 求最长公共子序列的简单DP+暴力枚举的更多相关文章
- HDU 1243 反恐训练营 (动态规划求最长公共子序列)
		
反恐训练营 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
 - hdu 1503 Advanced Fruits 最长公共子序列 *
		
Advanced Fruits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
 - HDU 1159 Common Subsequence 最长公共子序列
		
HDU 1159 Common Subsequence 最长公共子序列 题意 给你两个字符串,求出这两个字符串的最长公共子序列,这里的子序列不一定是连续的,只要满足前后关系就可以. 解题思路 这个当然 ...
 - Java实现 LeetCode 583 两个字符串的删除操作(求最长公共子序列问题)
		
583. 两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: " ...
 - [algorithm]求最长公共子序列问题
		
最直白方法:时间复杂度是O(n3), 空间复杂度是常数 reference:http://blog.csdn.net/monkeyandy/article/details/7957263 /** ** ...
 - 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
		
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...
 - 51 Nod 1006 最长公共子序列(LCS & DP)
		
原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006 题目分析: 首先先知道LCS问题,这有两种: Long ...
 - 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
		
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
 - HDU 1513 Palindrome(最长公共子序列)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 解题报告:给定一个长度为n的字符串,在这个字符串中插入最少的字符使得这个字符串成为回文串,求这个 ...
 
随机推荐
- OpenGL入门程序三:点、线、面的绘制
			
1.点: void TestPoint() { //点的大小默认为一个像素,通过下面的函数可以设置一点的大小 glPointSize(50.0f); glBegin(GL_POINTS); glVer ...
 - Mac下使用源码编译安装TensorFlow CPU版本
			
1.安装必要的软件 1.1.安装JDK 8 (1)JDK 8 can be downloaded from Oracle's JDK Page: http://www.oracle.com/techn ...
 - 一些有趣的使用function
			
转载来源:新人必看的短小而精悍的javascript function 1.回到顶部,优点使用浏览器刷新频率的requestAnimationFrame,很顺滑 const scrollToTop = ...
 - java.lang.RuntimeException: Unable to start activity ComponentInfo{com.autumn.book/com.autumn.book.MainActivity}: android.os.NetworkOnMainThreadException
			
不能把http请求写在主线程里,改为这样 Runnable runnable = new Runnable() { public void run() { HttpClient.post2(" ...
 - 『PyTorch』第十弹_循环神经网络
			
RNN基础: 『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练 TensorFlow RNN: 『TensotFlow』基础RNN网络分类问题 『TensotFlow』基础R ...
 - TitanX服务器登陆网关
 - Centos7上部署openstack mitaka配置详解(将疑难点都进行划分)
			
在配置openstack项目时很多人认为到处是坑,特别是新手,一旦进坑没有人指导,身体将会感觉一次次被掏空,作为菜鸟的我也感同身受,因为已经被掏空n次了. 以下也是我将整个openstack配置过程进 ...
 - C++技能重拾
			
0.虽然静态成员函数不存在this指针,但还是不能在一个class里声明同名同参的虚函数和静态成员函数. 1.vftable里一个虚函数表是一个指针 2.delete本质,调用析构函数同时释放内存Ob ...
 - idea Exception in thread "http-apr-8080-exec-2" java.lang.OutOfMemoryError: PermGen space
			
idea Exception in thread "http-apr-8080-exec-2" java.lang.OutOfMemoryError: PermGen space ...
 - jsp jstl的使用
			
1)下载jstl.jar和standard.jar文件,然后将其拷贝到tomcat的lib目录下. 具体的下载地址:http://mirrors.ccs.neu.edu/Apache/dist/jak ...