思路:
正反各求出每个数作为结尾数字的LIS,然后找出最长的Wavio Sequence,用O(n2)试了一次TLE,所以只能用O(nlogn)的算法。
Code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define INF 0x3f3f3f3f 4 #define M(a) memset(a, 0, sizeof(a)) 5 const int maxn = 10000 + 10; 6 int bd[maxn], ed[maxn], bg[maxn], eg[maxn], a[maxn], b[maxn]; 7 8 int main() { 9 int n; 10 while(~scanf("%d", &n)) { 11 M(bd), M(ed), M(eg), M(bg); 12 for (int i = 1; i <= n; ++i) { 13 scanf("%d", &a[i]); 14 b[n-i+1] = a[i]; 15 } 16 for (int i = 1; i <= n; ++i) bg[i] = eg[i] = INF; 17 for (int i = 1; i <= n; ++i) { 18 int k = lower_bound(bg+1, bg+n+1, a[i]) - bg; 19 bd[i] = k; 20 bg[k] = a[i]; 21 k = lower_bound(eg+1, eg+n+1, b[i]) - eg; 22 ed[i] = k; 23 eg[k] = b[i]; 24 } 25 int ans = 0, temp; 26 for (int i = 1; i <= n; ++i) { 27 temp = min(bd[i], ed[n-i+1]); 28 ans = max(ans, temp); 29 } 30 printf("%d\n", 2*ans-1); 31 } 32 33 return 0; 34 }