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;}