题目描述

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

输入格式

  每个序列用两行表示,第一行是长度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 ;
}

参考程序

最新文章

  1. 通过CSS的border绘制三角形
  2. OC的runtime运行机制
  3. 如何提高ASP.NET页面载入速度的方法
  4. 十家国内知名的EDM服务提供商
  5. IBatis 配置一对多
  6. iOS 获取快递物流信息(GCD异步加载)
  7. PXE批量部署linux操作系统
  8. OpenShare新功能@2014年第三季度
  9. 【HDOJ】2054 A == B ?
  10. 字符编码:ANSI,ASCII,GB2312,GBK,Big5,Unicode和UTF-8
  11. node读写json文件(进阶)
  12. scrapy安装教程
  13. debian The type initializer for &#39;System.Drawing.KnownColors&#39; threw an exception
  14. ELMO模型(Deep contextualized word representation)
  15. STL之partition学习
  16. EntityFramework附加实体
  17. Python爬虫实战四之抓取淘宝MM照片
  18. CentOS yum时出现&quot;Could not retrieve mirrorlist&quot;
  19. JaveScript-简介
  20. Nginx中间件使用心得(二)

热门文章

  1. 攻防世界--dmd-50
  2. NVIDIA Jetson TK1 开发板
  3. python集合set,交集,并集,差集,对称差集,子集和超集
  4. How To Find Out Attachments By File Type In Outlook?
  5. 《Spring Boot实战》笔记 (六章)
  6. [CentOS]安装软件:/lib/ld-linux.so.2: bad ELF interpreter 解决
  7. canvas 转盘文字
  8. vim/vi编辑工具实现多行注释和取消注释
  9. SpringCloud-Nexfilx
  10. Java的Object几个重写的方法