第九章 動態規劃-1283:登山

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章