​传送门:​

洛谷 P1091 合唱队形 DP_出队


题解:

可以看出题目让我们构造出倒 V 型数列,最少出队几个人 :

洛谷 P1091 合唱队形 DP_i++_02


对于上图的数列来说就是先增后减。要构造出以上数列,我们用

dp

求每个位置的单调递增个数和单调递减个数,这样也就是该位置的倒V数列的在队人数,我们只需要枚举每个位置,求出哪一个位置的人数最多即可,最后用总人数-max,得到答案

AC代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;;
int a[maxn];
int dp1[maxn],dp2[maxn];
int main()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
for(int i=1; i<=n; i++)
{
dp1[i]=1;
for(int j=1; j<i; j++)
{
if(a[j]<a[i])
{
dp1[i]=max(dp1[i],dp1[j]+1);
}
}
}
for(int i=n; i>=1; i--)
{
dp2[i]=1;
for(int j=i+1; j<=n; j++)
{
if(a[i]>a[j])
{
dp2[i]=max(dp2[i],dp2[j]+1);
}
}
}
int res=0;
for(int i=1; i<=n; i++)
{
res=max(res,dp1[i]+dp2[i]-1);
}
cout<<n-res<<endl;
}