题目描述:
暑假期间,队员们去登山观光,他们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?
输入格式
第一行,一个整数N,表示山上的景点数,2≤N≤1000
第二行,N个整数,表示每个景点的海拔
输出格式
输出一行,表示最多能够浏览的景点数
输入输出样列
输入样例1:
8 186 186 150 200 160 130 197 220
输出样例1:
4
【耗时限制】5000ms 【内存限制】128MB
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
#include <sstream>
#include <cstring>
#include <algorithm>
using namespace std;
int s[1000+10],x[1000+10],y[1000+10];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i){
cin>>s[i];
x[i]=y[i]=1;
}
for(int i=1;i<=n;++i){
for(int j=1;j<i;++j){
if(s[i]>s[j]){
x[i]=max(x[j]+1,x[i]);
}
}
}
for(int i=n;i>=1;i--){
for(int j=n;j>i;j--){
if(s[i]>s[j]){
y[i]=max(y[j]+1,y[i]);
}
}
}
int ans=0;
for(int i=1;i<=n;++i){
ans=max(ans,x[i]+y[i]-1);
}
cout<<ans;
return 0;
}