又是测试点3。。。34分
#include <iostream>
using namespace std;
const int maxn = 1e4 + 5;
int seq[maxn];
int up[maxn]; // up[i] : 从前往后以seq[i]结尾的最长递增子序列
int down[maxn];
int main(){
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++) scanf("%d",&seq[i]);
up[0] = 1;
for(int i = 1;i < n;i++){ // 考察seq[i]
int maxLength = 0;
for(int j = 0;j < i;j++){
if(seq[i] > seq[j] && up[j] > maxLength) maxLength = up[j];
}
up[i] = maxLength + 1;
}
down[n - 1] = 1;
for(int i = n - 2;i >= 0;i--){
int maxLength = 0;
for(int j = n - 1;j > i;j--){
if(seq[i] > seq[j] && down[j] > maxLength) maxLength = down[j];
}
down[i] = maxLength + 1;
}
bool upNoPeak = true,downNoPeak = true;
for(int i = 0;i < n;i++){
if(up[i] != 1) upNoPeak = false;
if(down[i] != 1) downNoPeak = false;
}
if(upNoPeak || downNoPeak){
printf("No peak shape");
system("pause");
return 0;
}
int pos = -1;
int maxLength = -1;
for(int i = 0;i < n;i++){
if(up[i] + down[i] > maxLength){
maxLength = up[i] + down[i];
pos = i;
}else if(up[i] + down[i] == maxLength && abs(up[i] - down[i]) < abs(up[pos] - down[pos])){
pos = i;
}
}
printf("%d %d %d",maxLength - 1,pos + 1,seq[pos]);
system("pause");
return 0;
}