题目描述:
描述合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,则他们的身高满足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
8 186 186 150 200 160 130 197 220
4题目理解:排合唱队形。留下的人需要在第i个位置之前上升子序列和之后下降子序列长度和最大,才能保证出来的人最少。
解题思路:就是求第i点之前最长上升子序列的长度,和第i点之后最长下降子序列长度,然后求和-1,即减去重复的那一个,即i算了两遍。然后用n减去和,即最少需要出列的同学。
源代码:
#include <iostream>
using namespace std;
int main()
{
int f[1002],w[1002],a[1002],n,i,k;
cin>>n;
for (i=1;i<=n;i++)
cin>>w[i];
f[1]=1;
for (i=1;i<=n;i++)
{
int max=0;
for (k=1;k<i;k++)
{
if (w[i]>w[k])
if (max<f[k])
max=f[k];
}
f[i]=max+1;
}
a[n]=1;
for (i=n;i>=1;i--)
{
int max=0;
for (k=n;k>i;k--)
{
if (w[i]>w[k])
if (max<a[k])
max=a[k];
}
a[i]=max+1;
}
int sum=-1;
for (i=1;i<=n;i++)
f[i]=f[i]+a[i];
for (i=1;i<=n;i++)
if (sum<f[i])
sum=f[i];
cout<<n-(sum-1)<<endl;
return 0;
}