Bailian2995 登山LIS

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bailian2995 登山LIS相关的知识,希望对你有一定的参考价值。

2995:登山
总时间限制: 5000ms 内存限制: 131072kB
描述
五一到了,PKU-ACM队组织大家去登山观光,队员们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?

输入
Line 1: N (2 <= N <= 1000) 景点数
Line 2: N个整数,每个景点的海拔
输出
最多能浏览的景点数
样例输入
8
186 186 150 200 160 130 197 220
样例输出
4
来源
第六届北京大学程序设计大赛暨ACM/ICPC选拔赛

问题链接Bailian2995 登山
问题简述:(略)
问题分析:做2次最长上升子序列计算,一次从前往后,一次从后往前,即分别算出上山和下山能游览的景点数量,求其和的最大值即可。
程序说明:(略)
参考链接:(略)
题记:(略)

AC的C++语言程序如下:

/* Bailian2995 登山 */

#include <bits/stdc++.h>

using namespace std;

const int N = 1000;
int a[N], dp[N][2];

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);

    memset(dp, 0, sizeof dp);
    for (int i = 0, l = n - 1; i < n; i++, l--)
        for (int j = 0, r = n - 1; j < i; j++, r--) {
            if (a[i] > a[j])
                dp[i][0] = max(dp[i][0], dp[j][0] + 1);
            if (a[l] > a[r])
                dp[l][1] = max(dp[l][1], dp[r][1] + 1);
        }

    int ans = 0;
    for (int i = 0; i < n; i++)
        ans = max(ans, dp[i][0] + dp[i][1]);

    printf("%d\\n", ans + 1);

    return 0;
}

以上是关于Bailian2995 登山LIS的主要内容,如果未能解决你的问题,请参考以下文章

Acwing-----1014. 登山

AcWing登山

前端学习(2995):vue+element今日头条管理--代码测试规范

LA 2995 立方体成像(模拟)

apriori片段代码

Image Is Everything LA2995