题意:看样例就知道。
思路:dp[i]的状态是长度为i+1的上升子序列中最小的值。
这里用到了STL lower_bound头文件是“algorithm”,函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
#define inf 0x3f3f3f3f
int dp[100010];
int a[100010];
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n) != EOF){
memset(dp,inf,sizeof(dp));
for(int i = 0;i < n; i++){
scanf("%d",&a[i]);
}
for(int i = 0;i < n; i++){
*lower_bound(dp,dp+n,a[i]) = a[i]; //其实就是找到a[i]属于自己的位置
}
printf("%d\n",lower_bound(dp,dp+n,inf)-dp); //很巧妙
}
return 0;
}