最大上升子序列nlogn实现
我们将原数组放入一个有序的数组中,如果大于最大元素则加入数组,否则每次二分查找大于等于他的那个数,并替换掉它,这里这个数不代表数的长度,只代表以该数结尾的序列的最大上升子序列的个数为这个数在数组中位置。
https://blog.csdn.net/shuangde800/article/details/7474903
#include<cstdio>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int a[30000+10];
int dp[30000+10];
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
fill(dp,dp+n,INF);
for(int i=1;i<=n;i++){
*lower_bound(dp,dp+n,a[i])=a[i];//lower_bound找到数组中第一个大于等于a[i]的位置
}
printf("%d\n",lower_bound(dp,dp+n,INF)-dp);
}
return 0;