题目描述

  给定两个整数序列,写一个程序求它们的最长上升公共子序列。

输入格式

  每个序列用两行表示,第一行是长度L,第二行是该序列。

输出格式

  在第一行,输出该LCIS的长度。第二行,输出该LCIS。

输入样例

5

1 4 2 5 -12

4

-12 1 2 4

输出样例

2

1 4

题解

  表面上看起来是个$O(n^{4})$,但实际上可以优化到$O(n^{2})$(貌似还可以用树状数组优化到$O(nlogn)$)

  我们设$dp[i][j]$为以$a_{1}$到$a_{i}$中的一个数和$b_{j}$为结尾的LCIS,容易得到当$a_{i} = b_{j}$时,$dp[i][j] = \underset{1 \leqslant k < j}{max} \left \{ dp[i - 1][k] + 1 \right \}$,否则$dp[i][j] = dp[i - 1][j]$。

  其实我们可以在枚举$i$、$j$的时候顺便维护$\underset{1 \leqslant k < j}{max} \left \{ dp[i - 1][k] + 1 \right \}$,这样就把时间复杂度降到$O(n^{2})$了。

  观察方程,其实我们第一位只会用到$i - 1$和$i$,这里又可以用滚动数组优化。

#include <iostream>

#define MAX_N (500 + 5)
#define MAX_M (500 + 5) using namespace std; int n, m;
int a[MAX_N], b[MAX_M];
int dp[MAX_M];
int p[MAX_M];
int ans; void LCIS(int x)
{
if(p[x]) LCIS(p[x]);
cout << b[x] << " ";
return;
} int main()
{
cin >> n;
for(register int i = ; i <= n; ++i)
{
cin >> a[i];
}
cin >> m;
for(register int i = ; i <= m; ++i)
{
cin >> b[i];
}
int pos = , tmp;
for(register int i = ; i <= n; ++i)
{
tmp = ;
for(register int j = ; j <= m; ++j)
{
if(a[i] > b[j] && dp[j] > dp[tmp]) tmp = j;
if(a[i] == b[j])
{
dp[j] = dp[tmp] + ;
p[j] = tmp;
}
}
}
for(register int i = ; i <= m; ++i)
{
if(dp[i] > dp[pos]) pos = i;
}
cout << dp[pos] << "\n";
if(dp[pos]) LCIS(pos);
return ;
}

参考程序

【题解】LCIS的更多相关文章

  1. CH5101 LCIS(最长公共上升子序列) 题解

    每日一题 day16 打卡 Analysis 设F[i,j]表示A[1..i]与B[1..j]并且以B[j]结尾的两段最长公共上升子序列,那么我们可以发现这样的转移 (1)A[i]==B[j]时 F[ ...

  2. BestCoder Round #87 LCIS(dp)

    LCIS 要用dp的思路想这题 [题目链接]LCIS [题目类型]dp &题意: 给定两个序列,求它们的最长公共递增子序列的长度, 并且这个子序列的值是连续的,比如(x,x+1,...,y−1 ...

  3. 8.3 LIS LCS LCIS(完结了==!)

    感觉这个专题真不好捉,伤心了,慢慢啃吧,孩纸 地址http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28195#overview 密码  ac ...

  4. Codeforces Beta Round #10 D. LCIS

    题目链接: http://www.codeforces.com/contest/10/problem/D D. LCIS time limit per test:1 secondmemory limi ...

  5. HDU 1423 Greatest Common Increasing Subsequence LCIS

    题目链接: 题目 Greatest Common Increasing Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...

  6. LCIS(线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. H - The LCIS on the Tree HDU - 4718

    The LCIS on the Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Oth ...

  8. Codeforces Beta Round #10 D. LCIS 动态规划

    D. LCIS 题目连接: http://www.codeforces.com/contest/10/problem/D Description This problem differs from o ...

  9. CF10D/POJ2127 LCIS解题报告

    题目传送门(洛谷)(CF)(POJ) 前言 期末考试前的最后一篇题解,希望期末考  rp++ 奇怪,为什么在CF上能过的代码到POJ上就 听取WA声一片  (不管了) 题目思路 LCIS模版O(n²) ...

随机推荐

  1. smbmount - 装载一个 smbfs 文件系统

    总览 SYNOPSIS smbmount {service} {mount-point} [-o options] 描述 DESCRIPTION smbmount 可以装载一个Linux SMB文件系 ...

  2. Linux 脚本运维总结之Shell script

    1. 本地变量和环境变量 变量类型 定义形式 声明位置 显示命令 作用域 本地变量 VARNAME=value 命令行或shell脚本 set (显示所有变量) 本用户,本进程 环境变量 export ...

  3. windows10安装nodejs 10和express 4

    最进做一个个人博客系统,前端用到了semanticUI,但是要使用npm工具包,所以需要安装nodejs,nodejs自带npm 下载 去官网下载自己系统对应的版本,我的是windows:下载 可以在 ...

  4. go语言从例子开始之Example33.工作池

    在这个例子中,我们将看到如何使用 Go 协程和通道实现一个工作池 . Example: package main import "fmt" import "time&qu ...

  5. python正则表达式 re (二)escape

    背景: 在使用python的过程中,你肯定对转义字符的使用苦恼过,因为有的时候我们需要使用一些特殊符号如”$ * . ^”等的原意,有时候需要被转义后的功能,并且转义字符地使用很繁琐,容易出错,那拯救 ...

  6. VisualVM监控远程主机

    参考博客 https://blog.csdn.net/u010004317/article/details/82948040 https://blog.csdn.net/lienfeng6/artic ...

  7. 再谈lmbench

    摸了一轮ltp-ddt 再回头来看lmbench bandwidth & latency合集小王子 用起来确实方便. 只是官网显示的用法是: Go to the top directory, ...

  8. BZOJ4269 再见xor

    考前挣扎 线性基裸题 mx直接求 次大直接从低到高枚举第一个非0位 然后次大就是异或上就行了[显然贪心呐qwq 不到800b可还行 //Love and Freedom. #include<cs ...

  9. leetcode-167周赛-1293-网格中的最短路径

    题目描述: 自己的提交:广度优先 O(mn*min(k,m+n)) class Solution: def shortestPath(self, grid, k: int) -> int: vi ...

  10. java 序列化机制

    package stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io ...