补一发很早的水题
QAQ
很早就AC啦,只是那时候木有博客,,
思路:最后的队形大概是”^”形状的
很自然的的想到去求一个位置的最大上升子序列和最大下降子序列(不必是连续的,要是那样就简单啦)
到最后枚举位置,求上述两个值的和的最大值,我们就知道了最少该去除几个人啦~(≧▽≦)/~啦啦啦
恩,还是挺简单的
2016-11-06 10:39:01第一次AC代码
那时候我代码真是吃藕啊,,,,
#include <cstdio>
#include <iostream>
using namespace std;
int f[1001],q[1001],a[1001];
int main()
{
int i,j,maxf,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
f[1]=1;q[n]=1;
for(i=2;i<=n;i++)
{
maxf=0;
for(j=1;j<i;j++)
if(a[j]<a[i]&&f[j]>maxf) maxf=f[j];
f[i]=++maxf;
}
for(i=n-1;i>=1;i--)
{
maxf=0;
for(j=n;j>i;j--)
if(a[j]<a[i]&&q[j]>maxf) maxf=q[j];
q[i]=++maxf;
}
maxf=-9;
for(i=1;i<=n;i++)
if(q[i]+f[i]>maxf) maxf=q[i]+f[i];
maxf--;
printf("%d",n-maxf);
return 0;
}
2017-06-02 15:12:19 二次AC代码
自我感觉码风还行
#include <cstdio>
#include <iostream>
using namespace std;
int h[9999],rise[9999],down[9999];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",h+i);
rise[1]=1;
down[n]=1;
for(int i=2;i<=n;i++)
{
int maxf=0;
for(int j=1;j<i;j++)
if(h[j]<h[i])
maxf=max(rise[j],maxf);
rise[i]=++maxf;
}
for(int i=n-1;i>=1;i--)
{
int maxf=0;
for(int j=n;j>i;j--)
if(h[j]<h[i])
maxf=max(down[j],maxf);
down[i]=++maxf;
}
int ans=-1;
for(int i=1;i<=n;i++)
ans=max(ans,rise[i]+down[i]);
printf("%d",n-ans+1);//注意本人重复了一次
return 0;
}