登山(动态规划)
作者:互联网
【Horn Studio】编程专栏:C++-登山(等级考试4级 测试T) 解题思路
题目
题目描述
五一到了,ICPC队组织大家去登山观光,队员们发现山上一共有N个景点,现在告诉你这N个景点的海拔。队员们决定按照顺序来浏览这些景点,即每次所浏览景点的下标都要大于前一个浏览景点的下标。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。 队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?
输入
Line 1: N (2 <= N <= 1000) 景点数。Line 2: N个整数,每个景点的海拔。
输出
最多能浏览的景点数。样例输入
8 186 186 150 200 160 130 197 220
样例输出
4
题目分析:
可以把这道题看成首尾相连的一个最长上升和一个最长下降的长度
那么问题就在于如何知道这个首尾相连的地方
找这个地方不难,直接枚举就行
上代码:
#include<bits/stdc++.h> using namespace std; int a[1000]={0},n=0,d[1000]={0},p[1000]={0},ans=0; int main(){ cin>>n; for(int i = 0;i<n;i++){ cin>>a[i];//输入 } for(int i = 0;i<n;i++){ d[i]=1; for(int j =0;j<i;j++){ if(a[j]<a[i]){ d[i]=max(d[i],d[j]+1);//以a[i]为结尾的最长上升子序列的长度 } } } for(int i = n-1;i>=0;i--){ p[i]=1; for(int j = n-1;j>i;j--){ if(a[j]<a[i]){ p[i]=max(p[i],p[j]+1);//以a[i]为结尾的最长下降子序列的长度 } } } for(int i =0;i<n;i++){ ans=max(ans,d[i]+p[i]-1);//枚举 } cout<<ans; return 0; }
over~
标签:登山,浏览,int,队员,景点,动态,规划,1000 来源: https://www.cnblogs.com/crs---stu/p/15989031.html