poj 3903
地址:http://poj.org/problem?id=3903
题意:求最长上升子序列。
mark:在网上学习一种O(nlgn)的算法,拿过来试验了一下。http://blog.sina.com.cn/s/blog_76344aef0100scyq.html
代码:
#include <stdio.h> int len; int a[100010]; int d[100010]; int find(int m) { int fr = 0, la = len-1, mid; while(fr <= la) { mid = (fr+la)/2; if(d[mid] == m) return 0; if(d[mid] > m) la = mid-1; else fr = mid+1; } return fr; } int main() { int n,m; int i; while(~scanf("%d", &n)) { len = 0; for(i = 0; i < n; i++) { scanf("%d", a+i); if(!len) {d[len++] = a[i]; continue;} if(a[i] < d[0]) {d[0] = a[i]; continue;} if(a[i] > d[len-1]) {d[len++] = a[i]; continue;} m = find(a[i]); if(m) d[m] = a[i]; } printf("%d\n", len); } return 0; }