解法一:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[105],f[2][105],ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
a[0]=0;
for(int i=2;i<=n;i++)//从1到n求最长升
for(int j=1;j<i;j++) if(a[i]>a[j]) f[0][i]=max(f[0][i],f[0][j]+1);//遇到不合适的地方不怕堵
for(int i=n-1;i;i--)//从n到1求最长升
for(int j=n;j>i;j--) if(a[i]>a[j]) f[1][i]=max(f[1][i],f[1][j]+1);
for(int i=1;i<=n;i++) ans=max(f[0][i]+f[1][i],ans);
printf("%d\n",n-(ans+1));
return 0;
}
解法二:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int a[N],f[N],g[N],s[N];
int main()
{//查这样的更方便而且转化只是一式子的事情!!!
int n; cin >> n;
for(int i = 1 ; i <= n ; i++) cin >> a[i],f[i] = 1,g[i] = 1;
for(int i = n-1 ; i >= 1 ; i--)
for(int j = n; j > i ; j--)
if(a[i] > a[j] && f[i] < f[j]+1)
f[i] = f[j] + 1;
for(int i = 2 ; i <= n ; i++)//最大值
for(int j = 1 ; j < i ; j++) /////////////////////
if(a[i] > a[j] && g[i]<=g[j]+1)
g[i] = g[j] + 1;//要执行就只执行一IC了
int maxx=0;
for(int i=1;i<=n;i++)
{
s[i]=f[i]+g[i]-1;//把每个数的左边从低到高的数和右边从高到低的数相加
//注意!!自己加了两次要-1
if(s[i]>maxx)
{
maxx=s[i];
}
}
cout<<n-maxx;//是求出列的人数
return 0;
}