动态规划、最长上升子序列类问题
合唱队形为一个上升子序列后接一个下降子序列,计算以 $i$ 结尾的最长上升子序列和以 $i$ 开头的最长下降子序列长度,分别记为 $lis_i$ 和 $lds_i$,答案为 $ n -\max \limits_{i=1}^{n} (lis_i+lds_i-1)$。
时间复杂度 $O(n^2)$。
#include<bits/stdc++.h>
using namespace std;
int n,ans,a[101],up[102],down[102];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
up[i]=down[i]=1;
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(a[i]<a[j]) up[j]=max(up[j],up[i]+1);
for(int i=n;i>=1;i--)
for(int j=i-1;j>=1;j--)
if(a[i]<a[j]) down[j]=max(down[j],down[i]+1);
for(int i=1;i<=n;i++)
ans=max(ans,up[i]+down[i]-1);
printf("%d\n",n-ans);
return 0;
}