这个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 0x3f3f3f3f
int 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;
}
uva_10534_Wavio Sequence( LIS )
最新推荐文章于 2014-11-02 00:58:50 发布