求以a[i]结尾的最长递增子序列长度dp1[i],和以a[i]开头的最长递减子序列dp2[i],将这两个长度相加-1,即是最后的合唱队列的长度,找出和昌队列最长的一个a[i],也可以求出需要多少同学出列
#include<iostream>
#include<climits>
using namespace std;
const int MAXN=101;
int a[MAXN];
int dp1[MAXN]; //dp1[i]表示以a[i]结尾的最长递增子序列
int dp2[MAXN]; //dp2[i]表示以a[i]开头的最长递减子序列
int main(){int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);dp1[i]=1;dp2[i]=1;}for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(a[i]>a[j]){dp1[i]=max(dp1[i],dp1[j]+1);}}}for(int i=n-2;i>=0;i--){for(int j=n-1;j>i;j--){if(a[i]>a[j]){dp2[i]=max(dp2[i],dp2[j]+1);}} }int minmum=INT_MAX;for(int i=0;i<n;i++){minmum=min(n-(dp1[i]+dp2[i]-1),minmum);}printf("%d\n",minmum);return 0;
}