该题用dp做
该队形是中间最高俩边为低
用俩个数组,一个数组算出从左往右求最大上升子序列
另外一个数组算出从右往左求最大上升子序列
然后俩个数组上的数相加就是队伍最大值+1,
用 N-队伍最大值 即为答案
#include<bits/stdc++.h>
using namespace std;
int a[1001];
int dp1[1001];
int dp2[1001];
int dp3[1001];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
dp1[i]=1;
dp2[i]=0;
}
for(int i=0;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-1;i>=0;i--)
{
for(int j=n-1;j>i;j--)
{
if(a[i]>a[j])//最大上升子序列
dp2[i]=max(dp2[i],dp2[j]+1);
}
}
for(int i=0;i<n;i++)
{
dp3[i]=dp1[i]+dp2[i];
}
cout<<n-*max_element(dp3,dp3+n);
}

京公网安备 11010502036488号