【题解】LCIS
2024-09-04 01:25:04
题目描述
给定两个整数序列,写一个程序求它们的最长上升公共子序列。
输入格式
每个序列用两行表示,第一行是长度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 ;
}
参考程序
最新文章
- 通过CSS的border绘制三角形
- OC的runtime运行机制
- 如何提高ASP.NET页面载入速度的方法
- 十家国内知名的EDM服务提供商
- IBatis 配置一对多
- iOS 获取快递物流信息(GCD异步加载)
- PXE批量部署linux操作系统
- OpenShare新功能@2014年第三季度
- 【HDOJ】2054 A == B ?
- 字符编码:ANSI,ASCII,GB2312,GBK,Big5,Unicode和UTF-8
- node读写json文件(进阶)
- scrapy安装教程
- debian The type initializer for &#39;System.Drawing.KnownColors&#39; threw an exception
- ELMO模型(Deep contextualized word representation)
- STL之partition学习
- EntityFramework附加实体
- Python爬虫实战四之抓取淘宝MM照片
- CentOS yum时出现";Could not retrieve mirrorlist";
- JaveScript-简介
- Nginx中间件使用心得(二)
热门文章
- 攻防世界--dmd-50
- NVIDIA Jetson TK1 开发板
- python集合set,交集,并集,差集,对称差集,子集和超集
- How To Find Out Attachments By File Type In Outlook?
- 《Spring Boot实战》笔记 (六章)
- [CentOS]安装软件:/lib/ld-linux.so.2: bad ELF interpreter 解决
- canvas 转盘文字
- vim/vi编辑工具实现多行注释和取消注释
- SpringCloud-Nexfilx
- Java的Object几个重写的方法