//最长上升子序列(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
{
int m=0;
for(int j=0;j
if(dp[j]>m && a[j]
m=dp[j];
dp[i]=m+1;
ans=max(dp[i],ans);
}
return ans;
}
//最长上升子序列 nlogn
//入口参数:数组名+数组长度,类型不限,结构体类型可以通过重载运算符实现
//数组下标从1号开始。
<pre name="code" class="cpp">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;
}