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的字符串,在这个字符串中插入最少的字符使得这个字符串成为回文串,求这个 ...
随机推荐
- Unity另外一套简单日志控制系统
using UnityEngine; public class LogPrintf { static LogLevel logLevel = LogLevel.LOG_LEVEL_ERROR; pub ...
- C#判断一个字符串是否全部为空格的一个简单方法
string nickName = " "; if (nickName.Trim() == string.Empty) { } else { }
- Java 常用对象-StringBuffer类
2017-11-02 20:57:02 StringBuffer:线程安全的可变字符序列.一个类似于 String 的字符串缓冲区,但不能修改.虽然在任意时间点上它都包含某种特定的字符序列,但通过某些 ...
- php.ini配置说明
1.设置时区为中国时区 date.timezone = PRC 2.设置支持MySql数据 extension=php_pdo_mysql.dll 直接将这个注释打开就OK了 3.让PHP支持简写&l ...
- English trip -- VC(情景课) 8 A Get ready
Words cashier # 收银员 a cashier counts money 收钱 custodian # 清洁工 a custodian cl ...
- 关于一致性hash详细
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...
- Please, another Queries on Array? CodeForces - 1114F (线段树,欧拉函数)
这题刚开始看成求区间$\phi$和了........先说一下区间和的做法吧...... 就是说将题目的操作2改为求$(\sum\limits_{i=l}^{r}\phi(a[i]))\%P$ 首先要知 ...
- Visio 入门教程
最近做一个新项目,目前在需求确立阶段,所以每天任务是写文档讨论再修改.由于是云端架构设计,避免不了图形图表配合文字说明,需要制作 E-R 图.网络图.时序图.UML 类图等,对比其他可视化图表工具,V ...
- view_countInfo
create view view_countInfo as SELECT a.dwmch, b.dwbh, b.djbh, c.rq, c.shl, c.djbh AS Expr1, d.sp ...
- ASCII码表(0-127 ) C中的转义字符
所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为 ...