题意:给你n个桥,求在不相交的情况下最大有多少桥可以存在。
题解:最小上升子序列。因为只用管桥的数量不用管是哪个桥,直接最小上升子序列。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cstring>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define ll long long
using namespace std;
int a[40000],dp[40000];
int main(){
int T,n;
cin>>T;
while(T--){
cin>>n;
memset(dp,0,sizeof dp);
for(int i = 1 ; i <= n ; i++){
scanf("%d",&a[i]);
}
dp[1] = a[1];
int len = 1;
for(int i = 2 ; i <= n ; i++){
if(a[i]>dp[len]){
// cout<<a[i]<<"-*-*-*-"<<endl;
dp[++len] = a[i];
}else{
int l = 1,r = len , m;
while(l<r){
m = (l+r)/2;
if(dp[m]>=a[i]){
r = m;
}else{
l = m + 1;
}
}
dp[l] = a[i];
}
}
cout<<len<<endl;
}
}