一些结论:
(1)下降子序列的个数就是最长上升子序列(反之同理)
(2)不相交两直线,只需要按第一坐标从小到大排序,再求上升子序列长度即可
int Lis_High(int a[])//上升
{
int len = 0;
for (int i = 0; i < n; i ++ )
{
int l = 0, r = len;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (q[mid] < a[i]) l = mid;
else r = mid - 1;
}
len = max(len, r + 1);
q[r + 1] = a[i];
}
return len;
}
int Lis_low(int a[])//下降
{
int len = 0;
for (int i = 0; i < n; i ++ )
{
int l = 0, r = len;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (q[mid] >=a[i]) l = mid;
else r = mid - 1;
}
len = max(len, r + 1);
q[r + 1] = a[i];
}
return len;