poj 1903 LIS的Nlogn解法

来源:互联网 发布:手机淘宝官网找回密码 编辑:程序博客网 时间:2024/05/16 09:05

用一个栈储存上升子序列,对每一个输入的数a,与num[top]相比,若a > num[top]入栈,否则在栈中找到第一个比a大的数,用a替换

查找时由于是有序,用二分查找

#include<iostream>using namespace std;int binarySearch(int l,int r,int sta[],int a){int low = l,high = r;while(low <= high){int mid = (low + high)/2;if(a >= sta[mid-1]&&a < sta[mid]) return mid;else if(a > sta[mid])low = mid + 1;elsehigh = mid - 1;}}int main(){int n,sta[100003];while(scanf("%d",&n) != EOF){int i,a,top = 1;sta[0] = INT_MIN;scanf("%d",&a);sta[top] = a;for(i = 1;i < n;i++){scanf("%d",&a);if(a > sta[top])sta[++top] = a;else{int j = binarySearch(1,top,sta,a);sta[j] = a;}}printf("%d\n",top);}return 0;}


原创粉丝点击