noi的进阶之旅(1)

题目描述

登山,ACM带队领队员们登山,队员们发现在山上有n个景点,并且决定按照一定的顺序登山,及每次所浏览的景点的编号都要大于前一个浏览景点的编号,同时队员们还有一个习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了,队员们希望满足上述条件的同时,极可能多地去浏览景点,你能帮他找出最多可能浏览的景点数吗?

问题分析

登山,ACM带队领队员们登山,队员们发现在山上有n个景点,并且决定按照一定的顺序登山,及每次所浏览的景点的编号都要大于前一个浏览景点的编号首先要有序
同时队员们还有一个习惯,就是不连续浏览海拔相同的两个景点,这句在写最长连续子序列时的判断有用,是>而不是>等于,因为要求不连续浏览海拔相同的景点
并且一旦开始下山,就不再向上走了又是个连续的下降区间
队员们希望满足上述条件的同时,极可能多地去浏览景点,你能帮他找出最多可能浏览的景点数吗?
总之,这道题目要求的就是一个最长上升区间和一个最长下降区间的并集,nice
noi的进阶之旅(1)_第1张图片

#include
using namespace std;
int a[10001],b[10001],c[10001],n;
int maxn=0;
int main()
{
 cin>>n;
 for(int i=1;i<=n;i++)
 cin>>a[i];
 for(int i=1;i<=n;i++)
 {
 	b[i]=1;
 	for(int j=1;j<=i-1;j++)
 	if(a[i]>a[j]&&b[j]+1>b[i])
    b[i]=b[j]+1;//最长上升子区间 
     }	
	for(int i=1;i<=n;i++)
	{
		c[i]=1;
		for(int j=1;j<=i-1;j++)
		if(a[i]<a[j]&&c[j]+1>c[i])
		c[i]=c[j]+1;
	}
	for(int i=1;i<=n;i++)
	if(b[i]+c[i]>maxn)
	maxn=b[i]+c[i];
	cout<<maxn-1;//其中有一段是重复的; 
	return 0;
	
 } 

你可能感兴趣的:(算法,小问题的解决,c++)