dp方程有一点 垃圾 奇怪
#include<bits/stdc++.h>
using namespace std;
int n,a[10005];
int dp[1005];//第 i 个人为中心点的合唱队型
int dp1[1005];//以第 i 个人为结尾的最长上升子序列
int dp2[1005];//以第 i 个人为开始的最长下降子序列
//dp(1,2)[1~n]=1
//若a[i] > a[i-j] , 那么 dp1[i]=max(dp1[i],dp1[i-j]+1)
//若a[i] > a[i+j] , 那么 dp2[i]=max(dp2[i],dp2[i+j]+1)
// dp[i]=dp1[i]+dp2[i]-1
/*
8
186 186 150 200 160 130 197 220
*/
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
dp1[i]=1;
dp2[i]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i-1;j++)
{
if(a[i]>a[i-j])
{
dp1[i]=max(dp1[i],dp1[i-j]+1);
}
}
dp[i]=dp1[i];
}
for(int i=1;i<=n;i++)
{
for(int j=n-i;j>=1;j--)
{
if(a[i]<a[i+j])
{
dp2[i]=max(dp2[i],dp2[i+j]+1);
}
}
dp[i]+=dp2[i]-1;
}
// for(int i=1;i<=n;i++)
// {
// cout<<"dp1["<<i<<"]="<<dp1[i]<<"\n";
// cout<<"dp2["<<i<<"]="<<dp2[i]<<"\n";
// cout<<"dp["<<i<<"]="<<dp[i]<<"\n------------------------\n";
// }
sort(dp+1,dp+n+1);
cout<<n-dp[n];
return 0;
}