【闲话】
清楚地记得以前写过...原来很久都没有听懂 听老师讲了好多遍才明白 不过还是忘记了(...)最长上升子序列可以说写的有点熟了但是下降老写错...多练吧唉 那可能还是没理解很好w 之前都没怎么注意缩进的问题 想怎么搞怎么搞...昨天翻书看if switch看到提示 想着还是注意一下括号的位置呀blabla的好了
【题目】
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,
他们的身高分别为T1,T2,…,TK,则他们的身高满足 T1 < T2 ...< Ti > Ti+1 > … >TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入格式】
第一行是一个整数N(2<=N<=100),表示同学的总数。
下来n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
【输出格式】
包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【样例输入】
8
186 186 150 200 160 130 197 220
【样例输出】
4
【代码】
#include<cstdio>
using namespace std;
int a[1005],b[1005],c[1005];
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++) b[i]=1;
for(int i=1;i<=n;i++)
{
for(int j=i-1;j>=b[i];j--)
{
if(a[j]<a[i])//
{
if(b[j]+1>b[i]) b[i]=b[j]+1;
}
}
}
for(int i=1;i<=n;i++) c[i]=1;
for(int i=n-1;i>=1;i--)//最后一个最长的是自己
{
for(int j=i+1;j<=n;j++)
{
if(a[i]>a[j])//一开始把>写成<了qwq
{
if(c[j]+1>c[i]) c[i]=c[j]+1;
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(ans<b[i]+c[i]-1) ans=b[i]+c[i]-1; //自己计算了两次
}
printf("%d",n-ans);
return 0;
}