您的位置:首页 > 其它

最长不下降子序列(可以改成最长上升子序列)

2016-07-29 17:26 330 查看
#include<bits/stdc++.h>
#define maxn 101111
using namespace std;
int a[maxn],b[maxn];
int Search(int num,int low,int high) {
int mid;
while(low<=high) {
mid=(low+high)/2;
if(num>=b[mid]) low=mid+1;
else high=mid-1;
}
return low;
}
int DP(int n) {
int i,len,pos;
b[1]=a[1];
len=1;
for(int i=2;i<=n;i++) {
if(a[i]>=b[len]) {
len=len+1;
b[len]=a[i];
}
else {
pos=Search(a[i],1,len);
b[pos]=a[i];
}
}
return len;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int ans=DP(n);
cout <<  ans <<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp