首先点名一个串叫 L1,另一个叫L2。

明显的是一个DP,那么我们来探讨下如何求得答案。

朴素的算法

首先我们定义状态$dp[ i ][ j ]$表示L1中前i个与L2中前j个的最长公共上升子序列。

最外层枚举i,第二层枚举j,那么L1[i]和L2[j]要么相等,要么不相等,分情况讨论。

■ L1[i]=L2[j] 那么我们以当前L1[i]的大小作为某个公共上升子序列的结尾元素,所以我们就需要向前找比这个结尾元素小的元素来接头,就需要找到dp[i-1][k] $(k<j&&a[k]<a[j])$中的最长的公共上升子序列的长度,然后其数列长度+1,就是现在dp[i][j]的值。

■ L[1]!=L2[j]那么这时候我们则需要继承前边最长的序列长度$dp[i][j]=max(dp[i-1][1->j-1])$.

这样的时间复杂度$O(n^2 \times m)$,空间复杂度$O(n \times m)$,比较朴素的一中做法。

代码自行脑补吧。。。。

优化

我们来优化一下上边的算法。

我们每个数在计算的时候,这一行前边的数我们已经都计算过了,在这之间我们完全可以用maxn记录一下最大值,避免再去循环枚举k,直接用maxn就好了。

时间复杂度$O(n \times m)$

void LCIS(){
memset(F,,sizeof(F));
for(int i=;i<=n;i++){
LL maxn = ;
for(int j=;j<=m;j++){
F[i][j] = F[i-][j];
if(a[i]>b[j] && maxn < F[i-][j]) maxn = F[i-][j];
if(a[i] == b[j])
F[i][j] = maxn+;
}
}
LL maxn = ;
for(int j=;j<=m;j++){
if(maxn < F[n][j]) maxn = F[n][j];
}
printf("%lld\n",maxn);
}

空间复杂的也可以通过压维进行优化。

对于每次dp[i][j]的改变我们只需要dp[i-1][1->j-1]中的最大值,压维以后,我们只需要dp[i][1->j-1]中的最大值,同样maxn记录就好了。

你可能会问:

每次我们查询后边的都会用到前边的,前边的改变后对后边的不会有影响么?

不会,因为我们只需要最大值,在这个数改变之前,进行最大值的替换,当它改变后对后边计算没有任何影响。

#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int T,n,m,f[],a[],b[],ans;
int max(int a,int b){ return a>b?a:b; }
int main()
{
freopen("codes.in","r",stdin);
freopen("codes.out","w",stdout);
scanf("%d",&T);
while(T--)
{
ans=;
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=;i<=m;i++)scanf("%d",&b[i]);
memset(f,,sizeof(f));
for(int i=;i<=n;i++)
{
int maxn=;
for(int j=;j<=m;j++)
{
if(a[i]>b[j])maxn=max(maxn,f[j]);
if(a[i]==b[j])f[j]=maxn+;
ans=max(ans,f[j]);
}
}
printf("%d\n",ans);
}
fclose(stdin);fclose(stdout);
}

LCIS 最长上升公共子序列问题的更多相关文章

  1. hdoj1423 最长上升公共子序列

    hdoj1423 题目分析: 两个数组a[n1] , b[n2], 求最长上升公共子序列. 我们可用一维存储 f[i] 表示 b 数组以 j 结尾, 与 a[] 数组构成的最长公共上升子序列. 对数组 ...

  2. 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)

    最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...

  3. 最长连续公共子序列(LCS)与最长递增公共子序列(LIS)

    最长公共子序列(不连续) 实际问题中也有比较多的应用,比如,论文查重这种,就是很实际的一个使用方面. 这个应该是最常见的一种了,不再赘述,直接按照转移方程来进行: 按最普通的方式就是,直接构造二维矩阵 ...

  4. HDU 1423 最长上升公共子序列(LCIS)

    题目大意: 给定两个数字数组a[] , b[],在这两个数组中找一个最长的公共上升子序列,输出最长的长度 从别人地方copy的= = LCIS理解: (1)f[i][j] 表示 a的前i,和b串前 j ...

  5. 求最长连续公共子序列 POJ 3080

    Description The Genographic Project is a research partnership between IBM and The National Geographi ...

  6. 贼有意思[最长上升公共子序列](SAC大佬测试题)

    题目描述Awson 最近越来越蠢了,一天就只知道 zyys.他定义了一个 zyys 数列:这个数列满足:1.是另外两个数列 A,B 的公共子序列;2.数列单调递增.现在他有一个问题,我们假设知道两个长 ...

  7. poj3080Blue Jeans(在m个串中找到这m个串的 最长连续公共子序列)

    Description The Genographic Project is a research partnership between IBM and The National Geographi ...

  8. 一维数组解最长上升公共子序列(LCIS)

    #include<bits/stdc++.h> using namespace std; + ; int n,a[maxn],b[maxn],dp[maxn]; int main() { ...

  9. CSU-1120 病毒(最长递增公共子序列)

    你有一个日志文件,里面记录着各种系统事件的详细信息.自然的,事件的时间戳按照严格递增顺序排列(不会有两个事件在完全相同的时刻发生). 遗憾的是,你的系统被病毒感染了,日志文件中混入了病毒生成的随机伪事 ...

随机推荐

  1. hdoj1789【贪心】

    题意: 已知有n个作业,每个作业呢,都是一天可以做完,每个作业都有一个截止日期,每个作业如果超过他的截止日期会扣分,最后让你求一个怎么安排求得一个最小扣的分数. 比如现在有3个作业 截止日期:3 3 ...

  2. PTA 模拟【string以及字母->数组下标】

    假设有九宫格输入法键盘布局如下: [ 1,.?! ] [ 2ABC ] [ 3DEF ] [ 4GHI ] [ 5JKL ] [ 6MNO ] [ 7PQRS ] [ 8TUV ] [ 9WXYZ ] ...

  3. 纯JS阻止浏览器默认滚动事件,实现自定义滚动方法

    首先该方法兼容IE7+以上浏览器,可以实现页面上下滚动,而且也可以实现页面左右滚动,每次滚动的距离为屏幕的大小,滚动为加速滚动 javaScript代码如下: //滚动实现方法,使用鼠标滚轮每次滚动浏 ...

  4. java 强大的反射机制

    这段时间,在对接一个开源的版本时,发现由于依赖的开源版本api老是随着版本的变化而变化,导致代码经常需要修改,异常痛苦. 终于,在一个风和日丽的下午(五月末的广州异常暴晒),楼主下定决心要修掉这个大篓 ...

  5. 关于${pageContext.request.contextPath}的理解(转载)

    ${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%> . 也就是取出部署的应用程 ...

  6. Zabbix-Server 添加主机

    之前讲解了如何配置Zabbix 服务端和客户端,现在我们来讲解下如何在zabbix监控端添加主机 Zabbix服务端:Centos 配置 Zabbix服务端 Zabbix客户端:Centos 配置 Z ...

  7. kettle 导入xml 资源文件

    Repository | ExploreRight click the root node of the repositorySelect Import objects from an XML fil ...

  8. sybase修改默认字符集为cp936

    原文地址:http://blog.sina.com.cn/s/blog_4d6854860100xn3f.html 报错信息:2402 error converting characters into ...

  9. UltraEdit配置C++开发环境

    1.下载UltraEdit软件安装 2.下载MinGW库安装 3.在系统设置环境变量,在path里加上你的MinGW\bin目录即可. 4.进入UltraEdit软件进行如下配置: 菜单栏---高级- ...

  10. PowerShell~语法与运算符

    基本语法 变量:$开头 $a = "Hello" 条件语句:if else ) { Write-Host "偶数" } else{ Write-Host &qu ...