比赛 20111102 评测结果 ATAAAAAAATT
题目名称 麻烦的聚餐 最终得分 72
用户昵称 Makazeu 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-02 21:06:24
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int H[30001];
int S[30001];
int X[30001];
int n;

void init()
{
	scanf("%d\n",&n);
	for (int i=1;i<=n;i++)
		scanf("%d\n",&H[i]);
}

void dp()
{
	//int maxn=0;
	for (int k=1;k<=n;k++)
	{
		//先DP出最長上升序列
		S[1]=1;
		for (int i=2;i<=n;i++)
		{
			S[i]=1;
			for (int j=1;j<=i-1;j++)
			{
				if(H[i]>=H[j] && S[j]+1>S[i])
					S[i]=S[j]+1;
			}
		}
		
		//再求最長下降序列
		X[n]=1;
		for (int i=n-1;i>=1;i--)
		{
			X[i]=1;
			for (int j=i+1;j<=n;j++)
			{
				if(H[i]>=H[j] && X[j]+1>X[i])
					X[i]=X[j]+1;
			}
		}
	}
	
	
	int Maxa=0;
	int Maxb=0;
	for (int i=1;i<=n;i++)
	{
		if(S[i]>Maxa)
			Maxa=S[i];
		if(X[i]>Maxb)
			Maxb=X[i];
	}
	int Min=n-Maxa;
	
	if(Min>(n-Maxb))
		Min=n-Maxb;
	
	cout<<Min<<endl;
}

int main()
{
	freopen("egroup.in","r",stdin);
	freopen("egroup.out","w",stdout);
	init();
	dp();
	//printf("%d\n",n-dp());
	return 0;
}