题目链接:http://bailian.openjudge.cn/practice/2757/
这是一道模板题,时间复杂度为O(nlogn),当然n^2的算法也可以AC,
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<queue> #include<map> #include<stack> #include<set> #include<vector> #include<algorithm> #define LL long long using namespace std; int a[1005]; int dp[1005]; int main() { int n,len; while(~scanf("%d",&n)){ len=1; for(int i=1;i<=n;i++) scanf("%d",&a[i]); dp[1]=a[1]; for(int i=2;i<=n;i++){ if(a[i]>dp[len]) dp[++len]=a[i]; // 可以直接添加到递增队列中; else{ int k=upper_bound(dp,dp+len,a[i])-dp; // 返回一个非递减序列[first, last)中的第一个大于值val的位置 dp[k]=a[i]; // 更新数据,方便后期更新; } } printf("%d\n",len); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-10 15:01:20