其他分享
首页 > 其他分享> > 登山(动态规划)

登山(动态规划)

作者:互联网

【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