/*有一个长度为n的数列,a1,a2,a3,a4,a5…… an,请求出这个序列中的最长上升子序列的长度,上升子序列指的是对于任意的i<j时,
ai<aj的子序列。
1<=n<=100;
0<=ai<=100000;]
上面的源代码中使用了lower_bound这是STL函数,这个函数从已排好序的a中利用二分搜索指向满足ai>=k的ai的最小指针,
类似的函数还有upper_bound,这一函数是求出的是指向满足ai>k的ai的最小指针,但是有了他们,再求长度为n的有序数组a中的k的个数,
可以用下面的代码求出upper_bound(a,a+n,k)-lower_bound(a,a+n,k)
*/
# include <iostream>
# include <stdio.h>
# include <algorithm>
using namespace std;
# define MAX_N 1000
# define INF 2^32-1
int n;
int a[MAX_N];
int dp[MAX_N];
void solve()
{
fill(dp,dp+n,INF);
for(int i=0;i<n;i++)
*lower_bound(dp,dp+n,a[i])=a[i];
printf("%d\n",lower_bound(dp,dp+n,INF)-dp);
}
int main()
{
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i];
solve();
}
return 0;
}
STL求最长上升子序列
最新推荐文章于 2019-12-17 10:47:26 发布