【题目描述】
五一到了,ACM队组织大家去登山观光,队员们发现山上一共有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?
【输入】
第一行:N (2 <= N <= 1000) 景点数;
第二行:N个整数,每个景点的海拔。
【输出】
最多能浏览的景点数。
【输入样例】
8
186 186 150 200 160 130 197 220
【输出样例】
4
AC代码:
#include<stdio.h>
#include<string.h>
#define MAX(x,y) (x>y?x:y)
#define MIN(x,y) (x>y?y:x)
#define M 1001
int a[M];
int dp_high[M], dp_fall[M];
int main()
{
int n;
scanf("%d", &n);
int i, j;
for (i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
dp_high[i] = 1;
dp_fall[i] = 1;
}
for (i = 1; i <= n; i++)
{
for (j = 1; j < i; j++)
{
if (a[i] > a[j] && dp_high[j] + 1 > dp_high[i])
{
dp_high[i] = dp_high[j] + 1;
}
}
}
for (i = n; i >= 1; i--)
{
for (j = n; j > i; j--)
{
if (a[i] > a[j] && dp_fall[j] + 1 > dp_fall[i])
{
dp_fall[i] = dp_fall[j] + 1;
}
}
}
int maxx = 1;
int num;
for (i = 1; i <= n; i++)
{
num = dp_high[i] + dp_fall[i] - 1;
maxx = MAX(maxx, num);
}
printf("%d", maxx);
return 0;
}