【最长先上升后下降子序列】 登山

传送门

题意

给定一个长度为\(N\)的序列\(A\),求最长的一个子序列,这个序列先上升后下降

数据范围

\(1\leq N\leq 1000\)

题解

分别求出每个点从前往后的最长上升子序列和最长下降子序列,去所有点这两个点去除重复点后的最大值

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define ll long long
const int N=1010;
int n,f[N],F[N],a[N];
int main(){
    scanf("%d",&n);
    rep(i,1,n+1) scanf("%d",&a[i]);

    rep(i,1,n+1) {
        f[i]=1;
        rep(j,1,i)
            if(a[j]<a[i])
                f[i]=max(f[i],f[j]+1);
    }
    per(i,1,n+1){
        F[i]=1;
        per(j,i+1,n+1)
            if(a[j]<a[i])
                F[i]=max(F[i],F[j]+1);
    }
    int ans=-1;
    rep(i,1,n+1)
        ans=max(ans,f[i]+F[i]-1);

        printf("%d\n",ans);
}


posted @ 2020-07-28 09:37  Hyx'  阅读(423)  评论(0编辑  收藏  举报