标签:class 结束 pop oid pac str tracking ems clr
给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列。并求出其长度。
如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。
7 1 9 10 5 11 2 13 2 2 -1
5 1
分析:跟hdoj1025原理http://blog.csdn.net/shengweisong/article/details/40347947一样
代码:
#include <stdio.h> #include <string.h> #include <algorithm> #define M 100005 using namespace std; int a[M], d[M]; int bis(int m, int len){ int left = 1, right = len, mid; while(left <= right){ mid = (right+left)>>1; if(d[mid] > m) right = mid-1; else if(d[mid]< m) left = mid+1; else return mid; } return left; } int main(){ int n; while(~scanf("%d", &n) ){ memset(d, 0, sizeof(d)); int i, len; for(i = 0; i < n; i ++){ scanf("%d", &a[i]); } //sort(a, a+n); len = 1; d[len] = a[i]; for(i = 1; i < n; i ++){ int t = bis(a[i], len); d[t] = a[i]; if(t>len) len++; } printf("%d\n", len); } return 0; }
标签:class 结束 pop oid pac str tracking ems clr
原文地址:http://www.cnblogs.com/mfmdaoyou/p/6937276.html