caioj1065:动态规划入门(一维一边推3:合唱队形)

【闲话】

清楚地记得以前写过...原来很久都没有听懂 听老师讲了好多遍才明白 不过还是忘记了(...)最长上升子序列可以说写的有点熟了但是下降老写错...多练吧唉 那可能还是没理解很好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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值