动态规划:最长非连续子序列类似题目
注:最后两个测试用例容易超时,需要进行优化
#include <stdio.h>
int n, m, l;
int in[201];
int order[201];
int getLongest(int *a, int *b, int m, int l);
int main(int argc, char *argv[]) {
int n, m, l;
int i, j;
scanf("%d", &n);
for (i = 0; i < 201; i++) {
in[i] = 0;
order[i] = 0;
}
scanf("%d", &m);
int *a = new int[m];
for (i = 0; i < m; i++) {
scanf("%d", &a[i]);
in[a[i]] = 1;
order[a[i]] = i;
}
scanf("%d", &l);
int *b = new int[l];
int cnt = 0;
for (i = 0; i < l; i++) {
int tmp;
scanf("%d", &tmp);
if (in[tmp] == 1) {
b[cnt++] = tmp;
}
}
l = cnt;
int out = getLongest(a, b, m, l);
printf("%d\n", out);
return 0;
}
int getLongest(int *a, int *b, int m, int l) {
int *d = new int[l];
int len = 0;
for (int i = 0; i < l; i++) {
d[i] = 1;
for (int j = 0; j < i; j++) {
if (order[b[j]] <= order[b[i]] && d[i] < d[j] + 1) {
d[i] = d[j] + 1;
}
}
if (len < d[i]) len = d[i];
}
return len;
}