【题目描述】
五一到了,ACM队组织大家去登山观光,队员们发现山上一共有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?
【输入】
第一行:N (2 <= N <= 1000) 景点数;
第二行:N个整数,每个景点的海拔。
【输出】
最多能浏览的景点数。
【输入样例】
8 186 186 150 200 160 130 197 220
【输出样例】
4
#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; }
一本通 1283:登山
最新推荐文章于 2024-06-09 10:13:12 发布