#define inf 0x7fffffff
int binary_search_1(int *ord,int digit,int len)
{
int left=0;int right=len;
while(left<=right)
{
int mid=left+(right-left)/2;
if(ord[mid]==digit)
{
return mid;
}
else if(ord[mid]>digit)
{
right=mid-1;
}
else
{
left=mid+1;
}
}
return left;
}
int LIS()
{
int n;
cin>>n;//输入原始数组的长度
int* sq=new int[n];
for(int i=0;i<n;i++)
cin>>sq[i];
int* ord=new int[n+1];//ord[k]代表为最长递增序列长度为k的最小值为ord[k]
ord[0]=-1;
int len=1;//有序数组首位标记
for(int i=0;i<n;i++)
{
ord[len]=inf;
int j=binary_search_1(ord,sq[i],len);
if(j==len)
{
len++;
}
ord[j]=sq[i];//更新
}
return len-1;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"LIS:"<<LIS();
return 0;
}
LIS 二分加速版
最新推荐文章于 2023-08-03 15:11:29 发布