思路:f[i][0]表示此点位于起伏序列的高点,f[[i][1]表示此点位于起伏序列的低处。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;
const int N = 5005;
int a[N];
int f[N][2];
int main()
{
int n,i,j;
while(~scanf("%d", &n)) {
if(!n) break;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int ans=0;
for(i=0;i<n;i++)
{
f[i][0]=f[i][1]=1; //初始化
for(j=0;j<i;j++)
{
if(a[i]>a[j]) //如果i点比j点大,说明i点位于子序列的高处,f[i][1]表示i点的状态,f[j][0]表示j点的状态。
f[i][1]=max(f[i][1],f[j][0]+1);
else
f[i][0]=max(f[i][0],f[j][1]+1);
}
ans=max(ans,f[i][0]);
ans=max(ans,f[i][1]);
}
printf("%d\n",ans);
}
return 0;
}