uva_10534_Wavio Sequence( LIS )

来源:互联网 发布:mysql有nvl函数吗 编辑:程序博客网 时间:2024/06/07 01:48
这个dp经典,一开始使用的是O(n^2)时间复杂度的算法,然后本机测试一个10000的case都要接近1s,submit后果断超时然后使用O(nlogn)的算法,表示没有压力,该算法是基于二分的思想#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define UP      0#define DOWN    1#define STATUS  2#define MAXN    10001#define INF     0x3f3f3f3fint val[MAXN], ans[MAXN];int up_order[MAXN], down_order[MAXN], up_idx, down_idx;int binary_search(const int &key, int *arr, int &idx){        if( !idx || key > arr[idx-1] ) {                arr[idx ++] = key; return idx;        }        int l(0), r(idx-1), m;        while( l <= r ) {                m = (l+r)>>1;                if( arr[m] == key ) {                        return idx;                }                else if( arr[m] > key ) {                        r = m-1;                }                else {                        l = m+1;                }        }        if( arr[l] > key ) {                arr[l] = key;        }        else if( arr[r] > key ) {                arr[r] = key;        }        return idx;}int dynamic_programming(const int &n){        int rst(0), down_val;        up_idx = down_idx = 0;        for(int i = 0; i < n; i ++) {                ans[i] = binary_search(val[i], up_order, up_idx);        }        for(int i = n-1; i >= 0; i --) {                down_val = binary_search(val[i], down_order, down_idx);                rst = max(rst, min(down_val,ans[i])*2);        }        return rst-1;}int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE        freopen("test.in", "r", stdin);#endif        int n;        while( ~scanf("%d", &n) ) {                for(int i = 0; i < n; i ++) {                        scanf("%d", &val[i]);                }                printf("%d\n", dynamic_programming(n));        }        return 0;}