您的位置:首页 > 其它

HDU 1950 Bridging signals(O(nlogn)算法LIS)

2015-04-07 17:52 295 查看
给出多个序列,求每个序列的最长上升子序列(LIS:Longest Increasing Subsequence)。

紫书上只给出了LIS的O(n^2)算法,百度O(nlogn)算法,顺便出了这道。遍历数组,用数组储存每个上升子序列的最小结尾。对当前数二分查找求下界,替换原结尾。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=40010;
int a[maxn],ans[maxn],len;
int main(){
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
ans[1]=a[1];
len=1;
for(int i=2;i<=n;++i)
if(a[i]>ans[len]) ans[++len]=a[i];
else{
int pos=lower_bound(ans,ans+len,a[i])-ans;
ans[pos]=a[i];
}
cout<<len<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: