Luogu P1091 合唱队形
先从\(1\)到\(n\)求一遍最长上升子序列,再反向从\(n\)到\(1\)求一遍最长上升子序列。最后遍历\(1\)到\(n\)得到两端相加最长的。记得输出是出列人数,所以要写\(n-ans\)。
#include<bits/stdc++.h>
#define N 110
using namespace std;
int n,ans;
int a[N],f[N][2];
void Read() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
return;
}
void Solve() {
for(int i=1;i<=n;i++) {
for(int j=0;j<i;j++) {
if(a[i]>a[j]) {
f[i][0]=max(f[i][0],f[j][0]+1);
}
}
}
for(int i=n;i>=1;i--) {
for(int j=n+1;j>i;j--) {
if(a[i]>a[j]) {
f[i][1]=max(f[i][1],f[j][1]+1);
}
}
}
for(int i=1;i<=n;i++) {
ans=max(ans,f[i][0]+f[i][1]-1);
}
printf("%d",n-ans);
return;
}
int main()
{
Read();
Solve();
return 0;
}