传送门

Luogu

解题思路

首先考虑怎么求方案,这样才可能会输出方案。

考虑 \(\text{DP}\)。

设 \(f[i][j]\) 表示在 \(a\) 序列中选择一个 \([1...i]\) 的子序列子序列 \(b[1...j]\) 匹配得到的最长LCIS(其中 \(b[j]\) 强制被选)。

有一个很显然的 \(O(n^3)\) 转移:

当 \(a_i = b_j\) 时:\(f[i][j] = \max\limits_{1\le k < j \text{且} b_k < b_j}\left\{f[i - 1][k] + 1\right\}\)

当 \(a_i \neq b_j\) 时:\(f[i][j] = f[i - 1][j]\)

这样子转移显然是没错的,但要是 \(1\le N \le 10^3\) 呢?

其实转移可以做到 \(O(n^2)\) 。

仔细想一想就可以发现这样做的转移是具有决策单调性的,我们每次进行第一种转移时,决策集合总是不断扩大的,我们大可不必每次都扫一遍取 \(\max\) 只要动态的维护一下决策集合中的最优决策点就好了。

然后再考虑输出方案。

我们设一个和 \(f\) 数组并存的 \(p\) 数组,每次成功转移时就更新一下 \(p\) ,最后就顺着 \(p\) 数组往前跳倒序输出就好了。

细节注意事项

  • 咕咕咕

参考代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#define rg register
using namespace std;
template < typename T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while (!isdigit(c)) f |= (c == '-'), c = getchar();
while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
s = f ? -s : s;
} const int _ = 500 + 10; int n, m, a[_], b[_];
int f[_][_], p[_][_]; inline void print(int id)
{ if (id) print(p[n][id]), printf("%d ", b[id]); } int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
read(n); for (rg int i = 1; i <= n; ++i) read(a[i]);
read(m); for (rg int i = 1; i <= m; ++i) read(b[i]);
a[0] = b[0] = -1;
for (rg int i = 1; i <= n; ++i)
for (rg int j = 1; j <= m; ++j) {
if (a[i] != b[j]) {
f[i][j] = f[i - 1][j], p[i][j] = p[i - 1][j];
} else {
for (rg int k = 0; k < j; ++k)
if (f[i][j] < f[i - 1][k] + 1 && b[k] < b[j])
f[i][j] = f[i - 1][k] + 1, p[i][j] = k;
}
}
int id = 0, _max = 0;
for (rg int i = 1; i <= m; ++i)
if (_max < f[n][i])
_max = f[n][i], id = i;
printf("%d\n", _max), print(id);
return 0;
}

完结撒花 \(qwq\)

最新文章

  1. 教你开发jQuery插件(转)
  2. Android属性之build.prop生成过程分析
  3. MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)
  4. 一个1年前的T-SQL问题
  5. linux - 输入输出重定向 及 管道
  6. 为VS2013添加SQLCE的支持
  7. CentOS6.5设备MRBS
  8. ecshop后台管理显示扩展分类
  9. asp.net调用Lodop实现页面打印或局部打印,可进行打印设置或预览
  10. 三十天学不会TCP,UDP/IP网络编程 - 绅士的开始
  11. CMCC验证绕过POC
  12. ubuntu16.04安装lnmp环境
  13. java中字符串&quot;1999-10-01T00:00:00+08: 00&quot; 转化为Date格式
  14. pyautogui 文档(四):消息框功能
  15. inline元素、block元素、inline-block元素
  16. [leetcode]205. Isomorphic Strings 同构字符串
  17. dfs的一个小实现(啊哈算法的例题)
  18. split和strip的使用
  19. 【观点】“马云:金融是要为外行人服务&quot;,这个观点其实并不新鲜
  20. 聚类效果评测-Fmeasure和Accuracy及其Matlab实现

热门文章

  1. WLC RTU license
  2. 洛谷P1006传纸条
  3. Java面向对象编程 -1.4
  4. python脚本监听nginx是否运行
  5. Nginx 七层反向代理
  6. centos610最小安装之后 后续设置
  7. 解决xpath中文乱码
  8. 记处理spring-devtools 和 通用mapper 使用问题
  9. Python 使用pillow 操作图像
  10. C++:面向对象的相关概念