题目描述:新来的实习生把路由线路搞得一团糟!如图,原本左右端口应当按顺序连接。现在只有切除部分线路,使得任何线路都不相交。希望你写一个程序计算最后剩下多少线路?
题解:题目的读入很坑,只要求读入一边顺序的即可,通过图片可以很清晰的看出,题目要求最长上升子序列,dp,O(n^2),二分O(nlogn)。
参考程序:
#include<cstdio>
#include<algorithm>
#define maxn 55000
#define INF 0x7ffffff
using namespace std;
int a[maxn];
int dp[maxn];
int main(){
int T;
scanf("%d",&T);
while (T--){
int n;
scanf("%d",&n);
for (int i=0;i<n;i++)
scanf("%d",&a[i]);
for (int i=0;i<=n;i++)dp[i]=INF;
for (int i=0;i<n;i++)
*lower_bound(dp,dp+n,a[i])=a[i];
printf("%d\n",lower_bound(dp,dp+n,INF)-dp);
}
return 0;
}