09G:登山

总时间限制: 
5000ms
 
内存限制: 
131072kB
描述

五一到了,PKU-ACM队组织大家去登山观光,队员们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?

输入
Line 1: N (2 <= N <= 1000) 景点数
Line 2: N个整数,每个景点的海拔
输出
最多能浏览的景点数
样例输入
8
186 186 150 200 160 130 197 220
样例输出
4
来源
第六届北京大学程序设计大赛暨ACM/ICPC选拔赛
 1 #include<iostream>
 2 #include<cstring> 
 3 using namespace std;
 4 int pre[1005]; //i结尾的最长上升 
 5 int after[1005]; //i开始的最长下降 
 6 int a[1005]; //高度 
 7 int main(){
 8     int n;
 9     cin>>n;
10     int i, j;
11     for(i = 0; i < n; i++)
12         cin>>a[i];
13     for(i = 0; i < n; i++){
14         for(j = 0; j < i; j++){
15             if(a[j]<a[i]) pre[i] = max(pre[j]+1, pre[i]);
16         }
17         pre[i] = max(pre[i], 1);
18     } 
19     for(i = n-1; i >= 0; i--){
20         for(j = i+1; j < n; j++){
21             if(a[j]<a[i]) after[i] = max(after[j]+1, after[i]);
22         }
23         after[i] = max(after[i], 1);
24     } 
25     int ans = 0;
26     for(i = 0; i < n; i++)
27         ans = max(ans, pre[i]+after[i]);
28     cout<<ans-1<<endl;
29     return 0;
30 }

就是要提醒一下,pre和after要注意初始化,即要么最开始初始化为1,要不然处理之后发现是0的话改成1

原文地址:https://www.cnblogs.com/fangziyuan/p/13098425.html