引用:

首先,我们要想出列最少,那么就想要留下的最多。很容易想的最长升,但是,这个序列是一个中间高,两头底的序列,最长升只能处理出单调性的序列。

那么怎么做到呢?

我们先看从T1到Ti这一段单调递增的序列,再看Ti到TK这一段单调递减的序列,那么问题就解决了。先从1到n求一趟最长升,然后从n到1也求一趟,最后枚举中间的Ti,然后从众多Ti中挑个大的。

#include <cstdio>
#include <algorithm>
using namespace std;
int n,nn[105],f[2][105],ans=-1;
int max(int a,int b){return a>b?a:b;}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&nn[i]);
    for(int i=1;i<n;i++){
        f[0][i]=1;
        for(int j=1;j<=i;j++)
            if(nn[i]>nn[j]&&f[0][j]>f[0][i]-1)f[0][i]=f[0][j]+1;
    }
    for(int i=n;i>=1;i--){
        f[1][i]=1;
        for(int j=n;j>i;j--)
            if(nn[i]>nn[j]&&f[1][j]>f[1][i]-1)f[1][i]=f[1][j]+1;
    }
    for(int i=1;i<=n;i++)ans=max(f[0][i]+f[1][i]-1,ans);
    printf("%d",(n-ans)>1?n-ans:0);
    return 0;
}