1、LIS:一个a序列,求它的最大上升子序列的最大长度
2、LCS:两个序列a和b,求他们最大公共子序列的长度
3、LCIS:两个序列a、b,求他们最大公共上升子序列长度
【求长度并输出序列:CF10D. LCIS】
#include <bits/stdc++.h>
using namespace std;
int a[1010], b[1010];
int f[1010], fa[1010];
int maxn, id;
int LCIS(int n, int m) {
memset(f, 0, sizeof(f));
for(int i = 1; i <= m; i++) fa[i] = 0;
for(int i = 1; i <= n; i++) {
int k = 0;
for(int j = 1; j <= m; j++) {
if(a[i] == b[j] && f[j] < f[k] + 1) {
f[j] = f[k] + 1;
fa[j] = k;
}
if(a[i] > b[j] && f[j] > f[k]) k = j;
}
}
maxn = -1, id = -1;
for(int j = 1; j <= m; j++) {
if(maxn < f[j]) {
maxn = f[j];
id = j;
}
}
}
void dfs(int x) {
if(fa[x] == 0) {
printf("%d ", b[x]);
return;
}
dfs(fa[x]);
printf("%d ", b[x]);
}
int main() {
int n, m;
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
scanf("%d", &m);
for(int j = 1; j <= m; j++) scanf("%d", &b[j]);
LCIS(n, m);
printf("%d\n", maxn);
if(maxn) {
dfs(id);
printf("\n");
}
return 0;
}