Fork me on GitHub

最长递增子序列(LIS)

时间复杂度nlogn,空间复杂度n

lmin[k]表示前i个元素中长度为k的所有递增子序列的最后一个元素的最小值。

#include<stdio.h>

#define N 10
int lmin[10];
//找到==或者大于e的第一个数的位置 
int bsearch(int a[],int p,int r,int e)
{
	int m;
	while(p<=r)
	{
		m=(p+r)>>1;
		if(a[m]>e)r=m-1;
		else if(a[m]<e)p=m+1;
		else return m;
	}
	return p;//返回大于的第一个数位置
	//return r;//应该是第一个小于 
} 
void lis(int a[],int lm[])
{
	int i,j;
	int mlen=0;
	lm[0]=a[0];
	for(i=0;i<N;i++)
	{
		if(a[i]>lm[mlen])
		{
			mlen++;
			lm[mlen]=a[i];
		}
		else
		{
			j=bsearch(lm,0,mlen,a[i]);
			lm[j]=a[i];
		}
	}
	printf("%d \n",mlen+1);
}
int main()
{
	int a[10]={2,1,6,2,3,4,7,9,6,7};
	//int a[10]={2,5,6,7,10,14,17,24,26,29};
	//printf("%d ",a[bsearch(a,0,9,10)]); 
	lis(a,lmin);
	
}


posted @ 2012-04-08 22:01  浪飞-louffy  阅读(156)  评论(0编辑  收藏  举报