当前位置:首页 > 题解目录 > 正文内容

【题解】合唱队形

亿万年的星光2年前 (2023-06-02)题解目录1755

【题目描写】

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;
 }


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

合影效果

【题目描述】小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念。如果他们站成一排,男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他...

【题解】找零钱—动态规划

给定一些人民币的面额,数量不限,要求找出金额为m元且人民币张数最少的方案。这个问题既可以是一个贪心问题也可以是一个动态规划的问题。对于现行的人民币面额:1、2、5、10、20、50、100,我们找任何...

2021年市南区程序设计竞赛(小学组)

1.建设病房(build.cpp)【题目描述】2020年1月23日下午,武汉市建设局紧急召集中建三局等单位举行专题会议,要求参照2003年抗击非典期间北京小汤山医院模式,在武汉职工疗养院建设火神山医院...

【题解】单词接龙

【题目描述】单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重...

【题解】阶乘问题

2.阶乘问题(fac.cpp)【题目描述】给定一个正整数n,求出一个最小的整数m并使得m!的末尾连续的0的个数小于n。m!=1*2*3*4*...*m【输入描述】第一行n。【输出描述】一个整数m。【样...

【题解】种花问题

【题目描述】假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给你一个整数数组 flowerbed 表示花坛,...