UVA-10534 Wavio Sequence (DP+LIS)


 

思路:

正反各求出每个数作为结尾数字的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 }

 

posted @ 2017-02-13 21:24  Robin!  阅读(185)  评论(0编辑  收藏  举报