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的字符串,在这个字符串中插入最少的字符使得这个字符串成为回文串,求这个 ...
随机推荐
- thinkphp5开发的网站出现”No input file specified”(php版本5.6.27)
thinkphp5开发的网站出现”No input file specified”(php版本5.6.27) 一.总结 一句话总结:搜索引擎一定要用google,比百度节约时间一万倍,google啊, ...
- linux机器之间拷贝和同步文件命令
1 不同机器拷贝文件 scp 文件 登录用户@机器IP:/目录/子目录 scp filename test@10.20.130.202:/home/test/ 2 文件[夹]同步 rsync ...
- 第5章——使用 Razor(MVC框架视图引擎)
Razor 是MVC框架视图引擎的名称. 本章提供 Razor 语法的快速教程,以使你能够识别 Razor 表达式. 本章不打算提供 Razor 的完整参考,而将其视为一个语法速成教程.在本书的后续内 ...
- 使用Div + CSS布局页面
在设计网页时,能够控制好各个模块在页面中的位置是非常关键的.本章将讲解利用Div+CSS对页面元素进行定位的方法. Div是HTML中指定的专门用于布局设计的容器对象 Div是CSS布局的核心对象. ...
- spark submit 入门
spark dirver本质是一个spark集群的驱动程序,你要调用spark集群的计算功能,必须要通过它! from pyspark import SparkConf, SparkContext c ...
- learning shell script prompt to run with superuser privileges (4)
Shell script prompt to run with superuser privileges [Purpose] Check whether have root privil ...
- linux abstract model of virtual memory
- 快速切题 sgu116. Index of super-prime bfs+树思想
116. Index of super-prime time limit per test: 0.25 sec. memory limit per test: 4096 KB Let P1, P2, ...
- Gradle 完整指南(Android)
Gradle 的编译周期 在解析 Gradle 的编译过程之前我们需要理解在 Gradle 中非常重要的两个对象.Project和Task. 每个项目的编译至少有一个 Project,一个 build ...
- slice,Array.prototype.slice,Array.protyotype.slice.call
slice 特点:基于当前数组中的一或多个项创建一个新数组.[原数组不会被修改] 返回结果:返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象. 语法: arr.slice() ...