【算法分析】
本题初看的时候以为是“最长不降子序列”的问题,但细看以后才发现是“合唱队形”的问题。按照“合唱队形”的算法去解题就可以了。
【参考代码】
#include <iostream>
#include <cstdio>
using namespace std;
int a[1005],b[1005],c[1005];
int main()
{
int n,i,j,maxx;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
//b[i]从左到右满足海拔递增的景点数
for(i=1;i<=n;i++){
b[i]=1;
for(j=1;j<=i-1;j++)
if((a[i]>a[j])&&(b[j]+1>b[i]))
b[i]=b[j]+1;
}
//c[i]从右到左满足海拔递增的景点数
for(i=n;i>=1;i--){
c[i]=1;
for(j=i+1;j<=n;j++)
if((a[j]<a[i])&&(c[j]+1>c[i]))
c[i]=c[j]+1;
}
//统计同时满足最优的最大数量
maxx=0;
for(i=1;i<=n;i++)
if(b[i]+c[i]>maxx)
maxx=b[i]+c[i];
//减去被重复使用的i景点
cout<<maxx-1<<endl;
return 0;
}