LIS(最長上升子序列)模板

int LIS(const int a[],int n)
{
	int lis[n],pre[n],js=1;
	lis[1]=1;
	for(int i=2;i<=n;i++)
	{
		int l=1,r=js,m;
		while(l<r)
		{
			m=(l+r)>>1;
			if(a[lis[m]]<a[i])	l=m+1;
			if(a[lis[m]]>a[i])	r=m;
		}
		if(r==1)
		{
			if(a[lis[1]]>a[i])
			{
				lis[1]=i;
				continue;
			}
		}
		if(r==js)
		{
			if(a[lis[js]]<a[i])
			{
				lis[++js]=i;
				pre[i]=lis[js-1];
				continue;
			}
		}
		lis[r]=i;
		pre[i]=lis[r-1];
	}
	return js;//返回長度 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章