对于同一个上升子序列, 最后一个元素越小,长度才可能越长。
具体过程每次替换后输出一下 dp 数组 , 一目了然。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
#define MAXN (1000000+10)
int a[MAXN], dp[MAXN];
#define INF 1e9
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i]), dp[i] = INF;
for(int i = 1; i <= n; i ++)
dp[lower_bound(dp+1, dp+n+1, a[i]) - dp] = a[i];
cout << (lower_bound(dp+1, dp+n+1, INF) - dp - 1) << endl;
return 0;
}