题目:http://poj.org/problem?id=1631
题意:在位置i上有数字ai。左边的i号点在右边连上ai点,问最大的不相交边数
分析:不相交的条件就是: 左边a<b 右边 a<b 或者左边a>b,右边a>b.,假如我们对左边按顺序遍历,那么只会存在第一种情况,跑最长上升子序列即可。。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 40005;
int len[maxn];
int main() {
int T; cin >> T;
while (T--) {
int n; scanf("%d", &n);
memset(len, 0, sizeof(len));
int ind = 1,inp;
scanf("%d", &len[1]);
for (int i = 1; i < n; i++) {
scanf("%d", &inp);
if (len[ind] < inp) len[++ind] = inp;
else {
len[lower_bound(len , len + ind + 1, inp) - len] = inp;
}
}
printf("%d\n", ind);
}
return 0;
}