dengch

 

登山

登山
题目概述:有n座景点,海拔各不相同。一个登山团队想要尽可能多的到访更多的景点,他们先上山游访,而后选择下山,且一旦下山,就会保持下山的状态(海拔依次递减)。问他们最多能够访问多少个景点。
解题思路:也很容易将其抽象为最长上升子序列模型。可以将其分成两部分,前半部分是上山,即正序做dp;后半部分是下山,即倒序做dp。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <set>
#include <vector>
#include <map>
#include <set>

using namespace std;

typedef long long LL;
typedef pair<int,int>PII;
const int N = 1010;

int h[N];
int f[N],g[N];

void solve(){
	int n;
	cin >> n;

	for(int i = 1; i <= n; i ++)cin >> h[i];

	int res = 0;
	for(int i = 1; i <= n; i ++){
		f[i] = 1;
		for(int j = 1; j < i; j ++){
			
			if(h[j] < h[i])f[i] = max(f[i],f[j] + 1);
		}
	}

	for(int i = n; i >= 1; i --){
		g[i] = 1;
		for(int j = n; j > i; j --){
			
			if(h[j] < h[i])g[i] = max(g[i],g[j] + 1);
		}
	}

	for(int i = 1; i <= n; i ++)res = max(res,f[i] + g[i] - 1);
	cout << res << endl;
}

int main(){
	int T = 1;

	while(T --){
		solve();
	}
	
}

posted on 2023-09-23 19:46  BkDench  阅读(60)  评论(0)    收藏  举报

导航