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