lis最长上升子序列

因为是最长上升的,可以用一个数组储存上升的序列,如果后一个数字比数组的最大数字还大,就加到末尾去,如果不大于,那么就可以把这个数组中比他大的数字替换掉,因为如果数字更小,后面上升序列更长的可能性更大,这样也不会改变之前最大的数字;最小同理

#include<iostream>
#include<cstdio>
#include<algorithm>
#define sf scanf
#define pf printf
#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
int a[100005];
int low[100005];
int h[100005];
int find(int le,int x)
{
	int l=1,r=le,mid;
	while(r>l)
	{
		mid=(l+r)/2;
		if(x>=h[mid])
		r=mid;
		else
		l=mid+1;
	}
	return l;
}
int main()
{
	int n,ans=1;
	sf("%d",&n);
	rep(i,1,n+1)
	sf("%d",&a[i]);
//	low[1]=a[1];//上升的 
//	rep(i,2,n+1)
//	{
//		if(low[ans]<a[i])
//		low[++ans]=a[i];
//		else
//		{
//			int j=lower_bound(low+1,low+ans+1,a[i])-low;
//			low[j]=a[i];
//		}
//	}
	int ans1=1;//下降的 
	h[1]=a[1];
	rep(i,2,n+1)
	{
		if(h[ans1]>a[i])
		h[++ans1]=a[i];
		else
		{
			int j=find(ans1,a[i]);
			h[j]=a[i];
		}
	}
	pf("%d\n",ans1);
	return 0;
}
posted @ 2018-08-25 09:05  一无所知小白龙  阅读(163)  评论(0编辑  收藏  举报