线性DP-登山

登山

题解:

这道题和怪盗基德那道题不同,这道题要求以一个节点为山顶,左边是上升趋势,右边是下降趋势的一个子序列。
这也是一个最长上升子序列模型,按照步骤来吧。
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;
}
发布了92 篇原创文章 · 获赞 6 · 访问量 1180

猜你喜欢

转载自blog.csdn.net/weixin_42979819/article/details/103897646