题目描述
NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K1,2,…,K,他们的身高分别为T_1,T_2,…,T_KT
1
,T
2
,…,T
K
, 则他们的身高满足T_1<…<T_i>T_{i+1}>…>T_K(1 \le i \le K)T
1
<…<T
i
>T
i+1
>…>T
K
(1≤i≤K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入输出格式
输入格式:
共二行。
第一行是一个整数N(2 \le N \le 100)N(2≤N≤100),表示同学的总数。
第二行有nn个整数,用空格分隔,第ii个整数T_i(130 \le T_i \le 230)T i (130≤T i ≤230)是第i位同学的身高(厘米)。
输出格式:
一个整数,最少需要几位同学出列。
输入输出样例
输入样例#1:
8
186 186 150 200 160 130 197 220
输出样例#1:
4
思路:可转变为从头尾开始分别求最长上升子序列,然后遍历找出最长队形就行了
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#pragma warning(disable:4996)
#define sf scanf
#define pf printf
#define sf2d(x,y) scanf("%d %d",&(x),&(y))
#define sfd(x) scanf("%d",&x)
#define sff(p) scanf("%lf",&p)
#define pfd(x) printf("%d\n",x)
#define mset(x,b) memset((x),b,sizeof(x))
struct Date {
int date;//数据
int rise;//上升
int dec;//下降
};
int main(void) {
int n;
Date a[105];
sfd(n);
for (int i = 0; i < n; i++)
sfd(a[i].date),a[i].dec = a[i].rise=1;
for (int i = 1; i < n; i++) {//从开始求最长上升子序列
for (int j = 0; j < i; j++) {
if (a[i].date > a[j].date)
a[i].rise = max(a[i].rise, a[j].rise + 1);
}
}
for (int i = n - 2; i >= 0; i--) {//从尾部求最长上升子序列
for (int j = n - 1; j > i; j--) {
if (a[i].date > a[j].date)
a[i].dec = max(a[i].dec, a[j].dec + 1);
}
}
int Max=0;
for (int i = 0; i < n; i++) {//遍历找最长队形
Max = max(Max, a[i].dec + a[i].rise);
}
pfd( n - ( Max - 1 ) );
return 0;
}