登山
题解:
这道题和怪盗基德那道题不同,这道题要求以一个节点为山顶,左边是上升趋势,右边是下降趋势的一个子序列。
这也是一个最长上升子序列模型,按照步骤来吧。
1,集合:以k为山顶的这种序列的答案(1<=k<=n)
2,属性:最大值
3,状态:以第k个景点为山峰。
4,last点:不同的山顶答案可能不同,所以last点就是我们选取山顶的点。
所以我们分别正向反向跑一边就是我们的答案了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N],f[N],g[N];
int main()
{
int n; cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
f[i]=1;
for(int j=1;j<i;j++){
if(a[i]>a[j]) f[i]=max(f[i],f[j]+1);
}
}
for(int i=n;i>=1;i--){
g[i]=1;
for(int j=n;j>i;j--){
if(a[i]>a[j]) g[i]=max(g[i],g[j]+1);
}
}
int res=0;
for(int i=1;i<=n;i++){
res=max(res,g[i]+f[i]-1);
}
cout<<res<<endl;
}