uva10534(最长递增子序列的算法变形 复杂度较低)

题目大意:
给出一串数字,求出这串数字中前n + 1个数字是递增的,后n + 1个数字是递减的,问这样的数字串最长是多少。

思路:
类似于uva10524
不能用最长递增子序列的算法 因为最大是10000 双重for会TLE

代码:

#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
#include <algorithm>

int num[10010];
int stack[10010];
int cnt1[10010];
int cnt2[10010];
int fun(int val,int & cnt){
    if(cnt == 0 || stack[cnt] < val)
        stack[++cnt] = val;
    else {
        int pos = lower_bound(stack,stack + cnt,val) - stack;
        stack[pos] = val;
    }
    return cnt;
}
int main() {
    int n;
    while(scanf("%d",&n) != EOF) {
        int top = 0;
        int cnt;
        memset(stack,0,sizeof(stack));
        memset(cnt1,0,sizeof(cnt1));
        memset(cnt2,0,sizeof(cnt2));
        cnt = 0;
        for(int i = 0; i < n ; i++) {
            scanf("%d",&num[i]);
            cnt1[i] = fun(num[i],cnt);
        }
        cnt = 0;
        for(int i = n - 1; i >= 0; i--) {
            cnt2[i] = fun(num[i],cnt);
        }
        int _max = 0;
        for(int i = 0; i < n ; i++)
            _max = max(_max,min(cnt1[i],cnt2[i]));
        printf("%d\n",_max * 2 - 1);

    }
    return 0;
}

你可能感兴趣的:(uva10534(最长递增子序列的算法变形 复杂度较低))