Description
给定一个数列,求满足对任意 (k=2i),有 (b[k-1]<b[k], b[k+1]<b[k]) 的子序列的最大长度。
Solution
首先很容易想出一个用线段树优化的 (O( nlog n)) 的 dp。
经过探究发现,答案就是波峰波谷数量的最大值,因为最终子序列中只取波峰波谷一定不会更劣。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2000005;
const int dbg = 1;
int n,a[N],h,l;
signed main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=n;i++)
{
if(a[i-1]<a[i]) h=max(h,l+1);
if(a[i-1]>a[i]) l=max(l,h+1);
}
cout<<max(h,l)+1<<endl;
if(dbg) system("pause");
}