给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。
如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。
输入有多组测试数据(<=7)每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。数据以EOF结束 。输入数据保证合法(全为int型整数)!输出对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。样例输入71 9 10 5 11 2 1322 -1样例输出51解决方法:复杂度为O(nlogn)的求最长递增子序列
#include <iostream>#include <cstdio>#include <cstring>#include <climits>#define maxn 100005using namespace std;int dp[maxn],a[maxn];int Search(int x,int len){ int left=1,right=len,mid=(left+right)>>1; while(left<=right) { if(x>dp[mid]) { left=mid+1; } else { if(x==dp[mid]) return mid; else { right=mid-1; } } mid=(left+right)>>1; } return left;}int main(){ int n; while(~scanf("%d",&n)) { for(int j=0;j<n;j++) scanf("%d",&a[j]); int cnt=1; dp[0]=-INT_MAX; dp[1]=a[0]; for(int j=1;j<n;j++) { int pos=Search(a[j],cnt);// dp[pos]=a[j]; if(pos>cnt) cnt=pos; } PRintf("%d/n",cnt); } return 0;}
新闻热点
疑难解答