登山
作者:
恒_41
,
2024-04-19 16:26:12
,
所有人可见
,
阅读 21
//这里填你的代码^^
/*1.2.2登山
【题目描述】
五一到了,ACM队组织大家去登山观光,队员们发现山上一个有N个景点,
并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。
同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,
并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,
尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?
【输入】
第一行:N(2 <= N <= 1000) 景点数;
第二行:N个整数,每个景点的海拔。
【输出】
最多能浏览的景点数。*/#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1100;
int a[N], f[N],g[N];//山的高度,以第i座山为结尾的正向和反向最长上升子序列的最大长度
int n;
int main() {
cin >> n;
int res = 0;
for (int i = 1; i <= n; i++) cin >> a[i];//读入建筑的高度
//正向最长上升子序列
for (int i = 1; i <= n; i++) {
f[i] = 1;
for (int j = 1; j < i; j++)
if (a[i] > a[j])
f[i] = max(f[i], f[j] + 1);//以第i座山为结尾的正向最长上升子序列的最大长度
}
//反向最长上升子序列
for (int i = n; i >= 1; i--) {
g[i] = 1;
for (int j = n; j > i; j--)
if (a[i] > a[j])
g[i] = max(g[i], g[j] + 1);
}
for (int i = 1; i <= n; i++)
res = max(res,g[i]+f[i]-1);//1代表波峰,被计算了两次
cout << res << endl;
return 0;
}