最长递增子序列
int lis[1005];//保存在下标之前包括下标元素在内的的序列中最长自序列,必须包括下标在内。
int list(int arr[],int n) //n^2算法 下标从1开始 最长递增
{
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;
}
int lis[1005];
int list(int arr[],int n) //n^2算法 下标从0开始
{
int i,j,max;
max = 0;
for(i=0;i<n;i++)
lis[i] = 1;
for(i=1;i<n;i++)
for(j=0;j<i;j++)
if(arr[i]<arr[j] && lis[i]<lis[j]+1) //最长递减子序列
lis[i] = lis[j] + 1;
for(i=0;i<n;i++)
if(max < lis[i])
max = lis[i];
return max;
}
int stack[10010]; //O(NlogN)
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;
}
最长递增子序列
最新推荐文章于 2021-12-19 22:07:39 发布