LIS && LCS && LCIS

来源:互联网 发布:男士 护肤品牌 知乎 编辑:程序博客网 时间:2024/05/21 05:55

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;}


0 0
原创粉丝点击