【最长先上升后下降子序列】 登山
传送门
题意
给定一个长度为\(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);
}