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;
}
标签:合唱队,int,up,down,P1091,删去
From: https://www.cnblogs.com/zxr000/p/17003299.html