HDU1423 Greatest Common Increasing Subsequence
题意
如标题。
\(|s1|,|s2| \leq 500\)
分析
既然是dp问题的组合,那么考虑dp。
定义状态f(i,j)表示对第一个序列s1的前i个和第二个序列s2的前j个元素求最长上升公共子序列,并且s1的第i个元素和s2的第j个元素匹配的结果,显然,当且仅当s1[i]=s2[j]时,f(i,j)有意义。
转移方程为:
\[f(i,j)=\max\{f(i',j')|i'<i,j'<j,s2[j']<s1[i]\}+1\]
这个朴素做法的时间复杂度为\(O(n^4)\)。我们尝试优化此方程,记\(opt(j')=\max\{f(i',j')\}\),保证f(i',j')有意义。那么转移方程为:
\[f(i,j)=\max\{opt(j')|j'<j,s2[j']<s1[i]\}+1\]
事实上,只需要从小到大枚举i,然后及时更新opt,就可以将转移的复杂度降为O(n)了。这样时间复杂度为\(O(n^3)\),已经可以过了。
代码
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff;
const int MAXN=5e2+7;
int n,m;
int a[MAXN],b[MAXN];
int f[MAXN][MAXN];
int opt[MAXN];
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
int T;
read(T);
while(T--)
{
memset(f,0,sizeof(f)); // edit 1
memset(opt,0,sizeof(opt));
read(n);
for(int i=1;i<=n;++i)
read(a[i]);
read(m);
for(int i=1;i<=m;++i)
read(b[i]);
int ans=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
if(a[i]!=b[j])
continue;
int t=0;
for(int k=1;k<j;++k)
if(b[k]<a[i])
t=max(t,opt[k]);
f[i][j]=t+1;
opt[j]=max(opt[j],f[i][j]);
ans=max(ans,f[i][j]);
}
printf("%d\n",ans);
if(T) // edit 2
puts("");
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
HDU1423 Greatest Common Increasing Subsequence的更多相关文章
- HDU4512完美队形I && HDU1423 Greatest Common Increasing Subsequence (LCIS)
填坑的时候又到啦,校赛因为不会LCIS所以吃了大亏,这里要补起来.LCIS就是在两个串里找最长上升子序列,相关的博客有很多,这里自己就不写那么多了. http://www.cnblogs.com/ja ...
- HDU1423 Greatest Common Increasing Subsequence (DP优化)
LIS和LCS的结合. 容易写出方程,复杂度是nm2,但我们可以去掉一层没有必要的枚举,用一个变量val记录前一阶段的最优解,这样优化成nm. 1<=k<j,j增加1,k的上界也增加1,就 ...
- HDU1423:Greatest Common Increasing Subsequence(LICS)
Problem Description This is a problem from ZOJ 2432.To make it easyer,you just need output the lengt ...
- Greatest Common Increasing Subsequence hdu1423
Greatest Common Increasing Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- HDU 1423 Greatest Common Increasing Subsequence LCIS
题目链接: 题目 Greatest Common Increasing Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- POJ 2127 Greatest Common Increasing Subsequence -- 动态规划
题目地址:http://poj.org/problem?id=2127 Description You are given two sequences of integer numbers. Writ ...
- HDOJ 1423 Greatest Common Increasing Subsequence -- 动态规划
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1423 Problem Description This is a problem from ZOJ 2 ...
- ZOJ 2432 Greatest Common Increasing Subsequence(最长公共上升子序列+路径打印)
Greatest Common Increasing Subsequence 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problem ...
- HDU 1423 Greatest Common Increasing Subsequence(最长公共上升LCIS)
HDU 1423 Greatest Common Increasing Subsequence(最长公共上升LCIS) http://acm.hdu.edu.cn/showproblem.php?pi ...
随机推荐
- 微服务API网关
当你选择采用微服务构建自己的程序,则你需要考虑客户端怎样与后端服务交互.对于一个单体应用,仅有一个服务群提供服务(通过负载均衡器实现).在微服务架构里面,每一个服务都暴漏了一个服务器集群.本篇文章我们 ...
- eclipse 与 tomcat 的那些路径
我们用mvn创建了一个web工程,同时希望在eclipse里调试开发.mvn有mvn的路径要求,eclispe有eclipse的默认路径,怎么整合二者? 首先介绍一下eclipse的默认路径. 重点在 ...
- 20170609批量生成WORD合同
Sub NextSeven_CodeFrame() Application.ScreenUpdating = False Application.DisplayAlerts = False Appli ...
- 看起来很懵的java内存加载面试题
源代码如下,求结果 public class MemoryAnalyse { public static int k = 0; public static MemoryAnalyse t1 = new ...
- Oracle11g温习-第九章:表空间和数据文件管理
2013年4月27日 星期六 10:37 1.tablespace 功能:从逻辑上简化数据库的管理 2.tablespace 概述 一个database 对应多个tablespace ,一个table ...
- spring cloud shutdown graceful 优雅停机
spring cloud shutdown graceful 优雅停机 当一个服务启动后,会注册到eureka中,其他的服务也可以从eureka获取到新注册的服务.但当我们要停止一个服务的时候,如果直 ...
- 数据库故障诊断(Troubleshooting)之性能问题导致的数据库严重故障案例之一
好久不来这里写东西,今天有点时间,来这里写点最近遇到的事情.前段时间,某电信业务用户因某核心生产库最近多次宕机重启,多方人员介入无果后,给我发来了邮件,大概意思就是现在该问题已经造成了比较严重的后果, ...
- Oracle数据库的“健康指示器”——事件(events)
Oracle数据库“赢在”在架构,这话还是有道理的,除了锁(lock)这个最大的架构上的“赢点”之外,Oracle事件(event)也是另外一个很重要的架构上的“赢点”,因为当今的Oracle数据库, ...
- 判断回文字符串(c,python)
回文字符串:一个字符串,不论是从左往右,还是从右往左,字符的顺序都是一样的(如abba,abcba等) 判断回文字符串比较简单,即用两个变量left,right模仿指针(一个指向第一个字符,一个指向最 ...
- spring boot 学习(十一)使用@Async实现异步调用
使用@Async实现异步调用 什么是”异步调用”与”同步调用” “同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行:”异步调用”则是只要上一行代码执行,无需等 ...