HDU4681_String
这个题目是这样的。
给你三个字符串A,B,C,(C一定是A和B的一个公共子序列)。
现在要求你构造出一个串D,使得D同时为A和B的子序列,且C是D的一个连续子串。求D的最大可能长度。
很简单的一个DP题。
其实这个题目有三个预处理就可以搞定了。
1、f1[i][j]:A的前i个字符,B的前J个字符的最长公共子序列。
2、f2[i][j]:A的i个字符以后,B的第J个字符以后的字符的最长公共子序列。
3、A和B串以某个位置开始作为C的子序列时,最近的匹配距离(最近匹配完的那个地方)。
有了这三个预处理,剩下的只要直接暴力枚举A和B中匹配的开始位置即可。
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #define maxn 1015
- using namespace std;
- int f1[maxn][maxn],f2[maxn][maxn],pos1[maxn],pos2[maxn],L1,L2,L,ans,cas=,t;
- char s1[maxn],s2[maxn],s[maxn];
- int main()
- {
- scanf("%d",&t);
- while (t--)
- {
- memset(f1,,sizeof f1);
- memset(f2,,sizeof f2);
- memset(s,,sizeof s);
- memset(pos1,,sizeof pos1);
- memset(pos2,,sizeof pos2);
- memset(s1,,sizeof s1);
- memset(s2,,sizeof s2);
- scanf("%s",s1+);scanf("%s",s2+);scanf("%s",s+);
- L1=strlen(s1+),L2=strlen(s2+),L=strlen(s+);
- for (int i=; s1[i]; i++)
- for (int j=; s2[j]; j++)
- {
- f1[i][j]=max(f1[i-][j],f1[i][j-]);
- if (s1[i]==s2[j])
- f1[i][j]=max(f1[i][j],f1[i-][j-]+);
- }
- f2[L1+][L2]=f2[L1][L2+]=f2[L1+][L2+]=;
- for (int i=L1; i>; i--)
- for (int j=L2; j>; j--)
- {
- f2[i][j]=max(f2[i+][j],f2[i][j+]);
- if (s1[i]==s2[j])
- f2[i][j]=max(f2[i][j],f2[i+][j+]+);
- }
- for (int i=; s1[i]; i++)
- {
- if (s1[i]!=s[])
- {
- pos1[i]=;
- continue;
- }
- int cur=,j=i;
- for (; s1[j]; j++)
- {
- if (s1[j]==s[cur]) cur++;
- if (!s[cur]) break;
- }
- if (!s[cur]) pos1[i]=j;
- else pos1[i]=;
- }
- for (int i=; s2[i]; i++)
- {
- if (s2[i]!=s[])
- {
- pos2[i]=;
- continue;
- }
- int cur=,j=i;
- for (;s2[j]; j++)
- {
- if (s2[j]==s[cur]) cur++;
- if (!s[cur]) break;
- }
- if (!s[cur]) pos2[i]=j;
- else pos2[i]=;
- }
- ans=L;
- for (int i=; s1[i]; i++)
- {
- if (pos1[i]==) continue;
- for (int j=; s2[j]; j++)
- {
- if (pos2[j]==) continue;
- ans=max(ans,L+f1[i-][j-]+f2[pos1[i]+][pos2[j]+]);
- }
- }
- printf("Case #%d: %d\n",++cas,ans);
- }
- return ;
- }
HDU4681_String的更多相关文章
随机推荐
- 20155234 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 (一)单元测试 ...
- 20155320 实验二 Java面向对象程序设计
20155320 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...
- 【LG5021】[NOIP2018]赛道修建
[LG5021][NOIP2018]赛道修建 题面 洛谷 题解 NOIP之前做过增强版还没做出来\(QAQ\) 一看到题目中的最大值最小,就很容易想到二分答案 重点是考虑如何\(check\) 设\( ...
- python 内置模块(hash lib)
用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 MD5 import hashlib hash=h ...
- ADO.NET操作MySQL数据库
前言 ADO.NET包括5大对象,分别是Connection.Command.DataReader.DataSet.DataAdapter,使用ADO.NET访问数据库有两个步骤:建立数据库连接.读取 ...
- Django之视图系统
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的python函数(类),它接受web请求并返回web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,或者 ...
- SpringBoot (1) idea下的环境搭建及demo
1.Spring Boot简介 wiki上的介绍: Spring Boot是Spring的常规配置解决方案,用于创建可以“运行”的独立的,生产级的基于Spring的应用程序.[22]它预先配置了Spr ...
- Git之hotfix热修复分支
1.假设你正在开发一个新功能, 需要新建一个new分支并切换: git checkout -b new 等价于 git branch new git checkout new 然后在这个new分支上已 ...
- leetcode个人题解——#40 Combination Sum2
思路:解法和39题类似,改动了两处: 1.因为题目要求每个元素只能出现一次(不代表每个数只能有一个,因为数据中会有重复的数字),所以代码中21行搜索时下一次循环的位置+1: 2.将临时存放答案的vec ...
- 华为笔试——C++消重输出
题目:消重输出 题目介绍: 输入一个正整数,给出消除重复数字以后最大的整数,注意需要考虑长整数. 例: 输入:988274320 输出:9874320 题目分析:这个结果的实现需要两个步骤:消重和排序 ...