题目描述
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入描述:
整数N
输出描述:
最少需要几位同学出列
示例1
输入
8 186 186 150 200 160 130 197 200
输出
4
#include<iostream>
using namespace std;
int main()
{
int n;
while (cin >> n )
{
int *stu = new int[n + 1];
int *f1 = new int[n + 2];
int *f2 = new int[n + 2];
int i, j;
for (i = 1; i <= n; i++)
{
cin >> stu[i];
f1[i] = f2[i] = 0;
}
f1[0] = f2[0] = 0;
f1[n + 1] = f2[n + 1] = 0;
//先求最长递增子序列
stu[0] = -1;
for (i = 1; i <= n; i++)
{
for (j = i - 1; j >= 0; j--)
{
if (stu[j] < stu[i] && f1[j] + 1 > f1[i])
f1[i] = f1[j] + 1;
}
}
//求最长递减子序列
stu[n + 1] = -1;
for (i = n; i >= 1; i--)
{
for (j = i + 1; j <= n + 1; j++)
{
if (stu[j] < stu[i] && f2[j] + 1 > f2[i])
f2[i] = f2[j] + 1;
}
}
//找出最合适的
int ans = 0;
for (i = 1; i <= n; i++)
{
if (ans < f1[i] + f2[i])
ans = f1[i] + f2[i];
}
cout << n - ans + 1 << endl;
}
return 0;
}