首页 > 代码库 > 最长上升子序列模板

最长上升子序列模板



//最长上升子序列(n^2)

//入口参数:1.数组名称 2.数组长度(从0开始)

int LIS(int a[],int len)
{
	int *dp=new int[len];
	int ans=1;
	dp[0]=1;
	for(int i=1;i<len;i++)
	{
		int m=0;
		for(int j=0;j<i;j++)
			if(dp[j]>m && a[j]<a[i])
				m=dp[j];
		dp[i]=m+1;
		ans=max(dp[i],ans);
	}
	return ans;
}

//最长上升子序列 nlogn

//入口参数:数组名+数组长度,类型不限,结构体类型可以通过重载运算符实现

//数组下标从1号开始。

int bsearch(int a[],int len,int num)
{
	int left=1,right=len;
	while(left<=right)
	{
		int mid=(left+right)/2;
		if(num<=a[mid])  //若最长不下降子序列,改<= 为 <
			right=mid-1;
		else
			left=mid+1;
	}
	return left;
}

int LIS(int a[],int len)
{
	int i,j,count=1;
	int *dp=new int[len+1];
	dp[1]=a[1];
	for(i=2;i<=len;i++)
	{
		if(a[i]>dp[count])	//若最长不下降子序列,改> 为 >=
			dp[++count]=a[i];
		else if(a[i]<=dp[1])    //若最长不下降子序列,改<= 为 <
			dp[1]=a[i];
		else
			dp[bsearch(dp,count,a[i])]=a[i];			
	}
	return count;
}