poj 1631 Bridging signals (DP_最長遞增子序列nlogn)
来源:互联网 发布:沙驰皮鞋 知乎 编辑:程序博客网 时间:2024/05/22 16:14
題目大意:給定1個序列,不會重復,x出現在y位置,即代表x與y可以連線。最後要從這個序列中儘量多地選擇連線並保證連線不交叉。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAXN 40001int v[MAXN], f[MAXN], idx;int binary_search(int x){ int l(0), r(idx-1), m; if( !idx || x > f[idx-1] ) { f[idx ++] = x; return idx; } while( l <= r ) { m = (l+r)>>1; if( f[m] < x ) { l = m+1; } else if( f[m] > x ) { r = m-1; } } if( l >= 0 && l < idx ) { f[l] = x; return idx; } if( r >= 0 && r < idx ) { f[r] = x; return idx; }}int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE freopen("test.in", "r", stdin);#endif int cas, n, rst; scanf("%d", &cas); for( ; cas; cas --) { scanf("%d", &n); rst = idx = 0; for(int i = 1; i <= n; i ++) { scanf("%d", &v[i]); } for(int i = 1; i <= n; i ++) { rst = max(rst, binary_search(v[i])); } printf("%d\n", rst); } return 0;}