AcWing 1014 登山 前后两遍LIS+枚举

编程入门 行业动态 更新时间:2024-10-05 11:15:47

AcWing 1014 登山 前后<a href=https://www.elefans.com/category/jswz/34/1754575.html style=两遍LIS+枚举"/>

AcWing 1014 登山 前后两遍LIS+枚举

题目描述:

五一到了,ACM队组织大家去登山观光,队员们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。

同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。

队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?

输入格式

第一行包含整数N,表示景点数量。

第二行包含N个整数,表示每个景点的海拔。

输出格式

输出一个整数,表示最多能浏览的景点数。

数据范围

2≤N≤1000

输入样例:

8
186 186 150 200 160 130 197 220


输出样例:

4

思路:先预处理前后两个最长上升子序列(LIS)长度,再枚举中间点k取最大的前后长度和。注意:由于k前后两LIS长度多算了一遍a[k],res要减一

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define x first
#define y second
typedef long long ll;
typedef pair<int,int> PII;
const int N=1e3+10;
int f[N],g[N],a[N];
int n;
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);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;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,f[i]+g[i]-1);cout<<res; return 0;
}

更多推荐

AcWing 1014 登山 前后两遍LIS+枚举

本文发布于:2024-02-28 06:21:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1768262.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:两遍   AcWing   LIS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!