/*
translation:
一块电路板,大致分为左右两竖排接口。现在有些接口接错了,导致线路有交错。例如左边的1接口接右2,
左2接右1,这两条线路是交错的。现在问不相交的线路最多多少条?
solution:
lis, dp
这道题要使线不相交,就会发现这是个lis的模型。所以按照lis求法来解就好了。但是注意要使用O(nlogn)
复杂度的解法,不然会超时。
note:
关于O(nlogn)的解法,定义dp[i]为长度为i的序列中末尾元素最小的值。一开始设最长上升子序列的长度为len=1
从第二位开始遍历数列。如果发现a[i] > dp[len],那就说明dp[++len]的值为a[i]。如果a[i]<=dp[len]
则利用二分查找寻找dp[j]>=a[i]的最小指针并返回。
date:
2016.9.7
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int max_p = 40000 + 5;
const int inf = 1e30;
int ports[max_p];
int n, p;
int dp[max_p];
int main()
{
//freopen("in.txt", "r", stdin);
scanf("%d", &n);
while(n--) {
scanf("%d", &p);
for(int i = 1; i <= p; i++) scanf("%d", &ports[i]);
dp[1] = ports[1];
int len = 1;
for(int i = 2; i <= p; i++) {
if(ports[i] > dp[len]) dp[++len] = ports[i];
else {
int pos = lower_bound(dp, dp + len, ports[i]) - dp;
dp[pos] = ports[i];
}
}
printf("%d\n", len);
}
return 0;
}
poj1631(O(nlogn的lis解法))
最新推荐文章于 2019-03-07 20:29:29 发布