1283:登山
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 7160 通過數: 2454
【題目描述】
五一到了,ACM隊組織大家去登山觀光,隊員們發現山上一共有N個景點,並且決定按照順序來瀏覽這些景點,即每次所瀏覽景點的編號都要大於前一個瀏覽景點的編號。同時隊員們還有另一個登山習慣,就是不連續瀏覽海拔相同的兩個景點,並且一旦開始下山,就不再向上走了。隊員們希望在滿足上面條件的同時,儘可能多的瀏覽景點,你能幫他們找出最多可能瀏覽的景點數麼?
【輸入】
第一行:N (2 ≤ N ≤ 1000) 景點數;
第二行:N個整數,每個景點的海拔。
【輸出】
最多能瀏覽的景點數。
【輸入樣例】
8
186 186 150 200 160 130 197 220
【輸出樣例】
4
思路:找出編號從小到大從低到高序列長度最大值 ,找出編號從大到小從高到低序列長度最大值 ,兩種情況數之和爲 計算最多瀏覽景點數。
#include<cstdio>
#include<iostream>
using namespace std;
int a[10001],b[1001],c[1001],i,j,n,maxx = 0;
int main(){
cin >> n;
for(i = 1; i <= n; i++)
cin >> a[i];
for(i = 1; i <= n; i++)
{
b[i] = 1;
for(j = 1; j <= i-1; j++)
if(a[i] > a[j] && b[j] + 1 > b[i])//找出編號從小到大,從低到高序列長度最大值
b[i] = b[j] + 1;
}
for(i = n; i >= 1; --i)
{
c[i] = 1;
for(j = i + 1; j <= n; ++j)
if(a[i] > a[j] && c[j] + 1 > c[i])//找出編號從大到小,從高到低序列長度最大值
c[i] = c[j] + 1;
}
for(i = 1; i <= n; i++)//計算最多瀏覽景點數
if(b[i] +c[i] > maxx)
maxx = b[i] + c[i];
printf("%d\n",maxx -1); //有1個景點被重複計算 -1
return 0;
}