#include<stdio.h>
const int N=100005;
int main()
{
int n,a,len;
int dp[N];
while(~scanf("%d",&n))
{
len=0;
dp[0]=-1;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
if(dp[len]<a)
{
dp[++len]=a;
}
else
{
int l=1; int r=len;
while(l<=r)
{
int mid=(l+r)>>1;
if(dp[mid]>a) r=mid-1;
else
l=mid+1;
}
dp[l]=a;
}
}
printf("%d\n",len);
}
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
#define MAXLEN 100
int solve(int* a, int n, vector<int>& seq) //数组,长度,存储逆序的序列
{
int res = 0;
int* dp = new int[n]; //存储以a[i]结尾的最大上升子序列长度
int p[MAXLEN]; //保存序列的前一个位置,可以理解为父节点
int k = -1; //保存最大上升子序列的最后位置
for (int i = 0; i < n; i++)
{
dp[i] = 1;
p[i] = -1;
for (int j = 0; j < i; j++)
{
if (a[j] < a[i] && dp[j] + 1 > dp[i])
{
dp[i] = dp[j] + 1;
p[i] = j;
}
}
if (dp[i] > res)
{
res = dp[i];
k = i;
}
}
while (k != -1) //保存结果序列
{
seq.push_back(a[k]);
k = p[k];
}
return res;
}
int main()
{
int a[] = {5,2,8,6,3,6,9,7};
int len = sizeof(a) / sizeof(int);
vector<int> seq;
cout << "len: " << solve(a, len, seq) << endl;
cout << "seq: ";
for (int i = seq.size(); i > 1; i--)
{
cout << seq[i-1] << " -> ";
}
cout << seq[0] << endl;
return 0;
}