标签:
Description
Input
Output
Sample Input
6 5 2 1 4 5 3 3 1 1 1 4 4 3 2 1
Sample Output
3 1 1
Hint
程序分析:此题的意思就是找到最长递增子序列。但是值得注意的是如果这题由于数据较大,就不能采用常规的DP方法来解答,那样时间复杂度为O(n^2),应采用二分,时间复杂度为n * logn。
程序代码:
#include <cstdio> #include<iostream> #include <cstring> #include <algorithm> using namespace std; int a[100005],c[100005],n; int bin(int size,int k) { int l = 1,r = size; while(l<=r) { int mid = (l+r)/2; if(k>c[mid]) l = mid+1; else r = mid-1; } return l; } int LIS() { int i,cnt=0,k; for(i = 1; i<=n; i++) { if(cnt == 0 || a[i]>c[cnt]) c[++cnt] = a[i]; else { k = bin(cnt,a[i]); c[k] = a[i]; } } return cnt; } int main() { long i; while(~scanf("%d",&n)) { for(i = 1; i<=n; i++) scanf("%d",&a[i]); printf("%d\n",LIS()); } return 0; }
标签:
原文地址:http://www.cnblogs.com/yilihua/p/4731118.html