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

来源:互联网 发布:web storm mac 编辑:程序博客网 时间:2024/05/22 08:15

题目大意:
给出一串数字,求出这串数字中前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;}
0 0
原创粉丝点击