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