1.复杂度O(n^2)算法
lis[i]保存的是以arr[i]为结尾的数组序列的最长递增子序列长度
例如,arr {10,22,9,33,21,50,41,60,80}
LIS的长度是6和 LIS为{10,22,33,50,60,80}。
记忆化搜索int list(int arr[],int n)
{
int i,j,max;
max = 0;
for(i=1;i<=n;i++)
lis[i] = 1;
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)
{
if(arr[i]>arr[j] && lis[i]<lis[j]+1)
lis[i] = lis[j] + 1;
}
}
for(i=1;i<=n;i++)
if(max < lis[i])
max = lis[i];
return max;
}
2.复杂度O(nlogn)算法
用栈模拟,二分优化查找进行替换
int stack[10010];
int lis(int arr[],int n)
{
int i,top,mid,low,high;
top = 0;
stack[0] = -1;
for(i=0;i<n;i++)
{
if(arr[i]>stack[top])
stack[++top] = arr[i];
else
{
low = 1;
high = top;
while(low <= high)
{
mid = (low + high)/2;
if(arr[i] > stack[mid])
low = mid + 1;
else
high = mid - 1;
}
stack[low] = arr[i];
}
}
return top;
}