P1091 合唱队形

P1091 合唱队形

题意:

给出一个长度为 \(n\) 的序列,要求从中删去一些数字,假设剩下的新的 \(a\) 数组,要求存在 \(a[1] < a[2] < ...<a[i] >a[i + 1] > ...a[k]\) 。求删去的数量最少是多少?

思路:

要求删去最少,其实变相就是求留下最多。

所以想到了求最长递增子序列,那么这道题就是求两次两个方向的最长递增子序列就可以了。

实现:

#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int up[N], down[N];
int a[N];
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++)
    {
        up[i] = 1;
        for (int j = 1; j < i; j++)
        {
            if (a[i] > a[j])
                up[i] = max(up[i], up[j] + 1);
        }
    }

    for (int i = n; i >= 1; i--)
    {
        down[i] = 1;
        for (int j = n; j > i; j--)
        {
            if (a[i] > a[j])
                down[i] = max(down[i], down[j] + 1);
        }
    }
    int res = 1e9;
    for (int i = 1; i <= n; i++)
        res = min(res, n + 1 - up[i] - down[i]);
    printf("%d\n", res);
    return 0;
}
posted @ 2022-12-24 19:50  zxr000  阅读(34)  评论(0)    收藏  举报