题意:
略
分析:
經典LIS問題,時間複雜度可以為o(nlogn),至於O(n^2)是否可行,沒有試過
Code:
#include <map>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define REPI(i, s, e) for(int i = (s); i <= (e); i ++)
#define REPD(i, e, s) for(int i = (e); i >= (s); i --)
const int MAXN = 10000;
int val[MAXN+1], up[MAXN+1], down[MAXN+1], f[MAXN+1];
void input(int n)
{
REPI(i, 1, n) {
scanf("%d", &val[i]);
}
}
int process(int n)
{
int idx = 0;
REPI(i, 1, n) {
if( !idx ) {
f[idx ++] = val[i];
}
else if( f[idx-1] < val[i] ) {
f[idx ++] = val[i];
}
else {
int mid = lower_bound(f, f+idx, val[i])-f;
f[mid] = val[i];
}
up[i] = idx;
}
idx = 0;
REPD(i, n, 1) {
if( !idx ) {
f[idx ++] = val[i];
}
else if( f[idx-1] < val[i] ) {
f[idx ++] = val[i];
}
else {
int mid = lower_bound(f, f+idx, val[i])-f;
f[mid] = val[i];
}
down[i] = idx;
}
int rst = 0;
REPI(i, 1, n) {
int tmp = min(up[i], down[i]);
rst = max(rst, 2*tmp-1);
}
return rst;
}
int main(int agc, char **argv)
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int n;
while( ~scanf("%d", &n) ) {
input(n);
printf("%d\n", process(n));
}
return 0;
}