题解 | #合唱队#最长递增序列长度+最长递减序列长度-1的最大值

合唱队

http://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4

/*HJ24合唱团
不允许改变队列元素的先后顺序 
且 不要求最高同学左右人数必须相等
已知所有N位同学的身高,计算最少需要几位同学出列,
可以使得剩下的同学排成合唱队形。
找最长递增递减子序列*/
#include <iostream>
#include <queue>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a[3000];
	int maxx=0;//合唱序列长度最大值
	vector<int>dp0(3000,1);//递增序列长度
	vector<int>dp1(3000,1);//递减序列长度
	vector<int>dp(3000,1);//合唱序列长度
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n;i++)//递增子序列长度 
	{
		for(int j=0;j<i;j++)
		if(a[i]>a[j]) dp0[i]=max(dp0[i],dp0[j]+1);
	}
	for(int i=n-1;i>=0;i--)//递减子序列长度 
	{
		for(int j=n-1;j>i;j--)
		if(a[i]>a[j]) dp1[i]=max(dp1[i],dp1[j]+1);
	}
	for(int i=0;i<n;i++) 
	{
		dp[i]=dp0[i]+dp1[i]-1;
		if(dp[i]>=maxx) maxx=dp[i];
//		cout<<dp0[i]<<" ";
	}	
	cout<<n-maxx<<endl;
} 
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务