$n$ 位同学站成一排,音乐老师要请其中的 $n-k$ 位同学出列,使得剩下的 $k$ 位同学排成合唱队形。
合唱队形是指这样的一种队形:设 $k$ 位同学从左到右依次编号为 $1,2,$ … $,k$,他们的身高分别为 $t_1,t_2,$ … $,t_k$,则他们的身高满足 $t_1< \cdots <t_i>t_{i+1}>$ … $>t_k(1\le i\le k)$。
你的任务是,已知所有 $n$ 位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
共二行。
第一行是一个整数 $n$($2\le n\le100$),表示同学的总数。
第二行有 $n$ 个整数,用空格分隔,第 $i$ 个整数 $t_i$($130\le t_i\le230$)是第 $i$ 位同学的身高(厘米)。
## 输出格式
一个整数,最少需要几位同学出列。
8 186 186 150 200 160 130 197 220
4
对于 $50\%$ 的数据,保证有 $n \le 20$。
对于全部的数据,保证有 $n \le 100$。
#include <bits/stdc++.h> #define AC return 0 using namespace std; int n, a[110], s[2][110], ans; int main() { cin >> n; for (int i = 1; i <= n; i++) scanf("%d", a + i); for (int i = 1; i <= n; i++) for (int j = 0; j < i; j++) if (a[i] > a[j]) s[0][i] = max(s[0][i], s[0][j] + 1); a[n + 1] = 0; for (int i = n; i; i--) for (int j = n + 1; j > i; j--) if (a[i] > a[j]) s[1][i] = max(s[1][i], s[1][j] + 1); for (int i = 1; i <= n; i++) ans = max(s[0][i] + s[1][i] - 1, ans); cout << n - ans << endl; AC; }