青少年编程知识记录 codecoming

【题解】合唱队形

【题目描写】

N位同学站成一排,音乐老师要请其中的(N−K)位同学出列,使得剩下的KK位同学排成合唱队形。



合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K,他们的身高分别为T1,T2,…,TK,则他们的身高满足T1<T2<…<Ti,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<bits/stdc++.h>  using namespace std;  int n,a[110],f[110][2],MAX;//f[i][1]表示上升子序列的个数,f[i][2]表示下降子序列的个数  int main()  {  	cin>>n;  	for(int i=1;i<=n;i++)  	{  		cin>>a[i];  		int mx=0;  		for(int j=1;j<i;j++)  		{  			if(a[j]<a[i])  			{  				mx=max(mx,f[j][1]);//求上升子序列的最大值,也就是第一部分可以留下的最大人数  			}  		}  		f[i][1]=mx+1;  	}  	for(int i=n;i>=1;i--)  	{  		int mx=0;  		for(int j=n;j>i;j--)  		{  			if(a[j]<a[i])  			{  				mx=max(mx,f[j][2]);  			}  		}  		f[i][2]=mx+1;  		MAX=max(MAX,f[i][1]+f[i][2]-1);//f[i][1]+f[i][2]-1表示当a[i]最高点时留下的人数,这里减一,因为上升和下降的个数都包括了最高点,所以减去一个  	}  	cout<<n-MAX<<endl;  	return 0;   }



(adsbygoogle = window.adsbygoogle || []).push({});

作者:亿万年的星光 分类:题解目录 浏览: