当前位置:首页 > 题解目录 > 正文内容

【题解】登山

亿万年的星光2年前 (2023-06-02)题解目录3786

【题目描述】

五一到了,ACM队组织大家去登山观光,队员们发现山上一共有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?

【输入描述】

第一行:N (2 <= N <= 1000) 景点数;

第二行:N个整数,每个景点的海拔。

【输出描述】

最多能浏览的景点数。

【样例输入】

8
186 186 150 200 160 130 197 220

【样例输出】

4

【题目分析】


根据题目上面的图片,我们按照类似与上面这样的顶点进行划分。

假设:

a[1]是顶点,

a[2]是顶点,

a[3]是顶点,

....

a[n-1]是顶点,

a[n]是顶点。

我们假设顶点是a[k],上山和下山这两段是完全独立的。

为了让最终结果最大,只需要分别使两段的结果最大即可。类似:怪盗基德 那道题。

我们定义两个数组,f[i]表示从左往右求,以a[i]为结尾的最长上升序列的最长长度。

g[i]表示从右往左求,以a[i]为结尾的最长上升序列的最长长度(从左往右看是最长下降子序列)。

那么以a[k]为顶点的最大结果= f[k]+g[k]-1( a[k]被算了两次)


【参考答案】

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=1e3+5;
int a[maxn],b[maxn],c[maxn];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)//找出上升序列的最长序列 
	{
		b[i]=1;
		for(int j=1;j<i;j++)
		if(a[j]<a[i])
		b[i]=max(b[i],b[j]+1);
	}
	for(int i=n;i>=1;i--)//找出下降序列的最长序列 
	{
		c[i]=1;
		for(int j=n;j>i;j--)
		if(a[j]<a[i])
		c[i]=max(c[i],c[j]+1);
	}
	int sum=0;
	for(int i=1;i<=n;i++)
	sum=max(c[i]+b[i],sum);
	printf("%d\n",sum-1);//因为上升序列和下降序列公用一个顶点 
}




扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【题解】01串

【题目描述】Fans是个ACM程序设计迷。有时侯,他表现出很强烈的逆反心理,你往东,他往西,你往南,他偏往北。这一次,不知道又是谁惹着他了,好端端的一个个01串,到了他的手里,都变成10串了。请你编个...

【题解】切比雪夫距离

【题目描述】小C有一个平面!它发现了平面上的两个点,请你求出求它们之间的切比雪夫距离。切比雪夫距离定义为x与y方向坐标差的绝对值较大值。【输入描述】四个整数,a,b,c,d。坐标为(a,b)与(c,d...

【题解目录】友好城市

【题解目录】友好城市

【题目描述】Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河...

【题解】均分蛋糕

【题目描述】小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, an。小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕,对于每个...

八皇后问题

八皇后问题

【题目描述】八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行...

【循环】日记第几天

【题目描述】小明每天都坚持写日记,突然有一天小明在想,我今年写了多少篇日记了?一篇一篇的数好麻烦,没办法小明只能把这个艰难的问题交给聪明的你来解决。【输入描述】输入三个整数�y,m,d分别表示年月日,...