类似于最长上升子序列;
dp[i]=max(dp[i],dp[j]+1) (a[i]>a[j])
#include<bits/stdc++.h>
using namespace std;
int n,t[200],dp[200],dp1[200],ans;//dp是左半段,dp1是右半段
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>t[i],dp[i]=1,dp1[i]=1;
for(int i=1;i<=n;i++)//枚举以i点的值为分界线
{
for(int j=1;j<=i;j++)//以i点为结尾,因为是以i作为前半段的结尾数
{
for(int k=1;k<=j;k++)
if(t[j]>t[k]){
dp[j]=max(dp[j],dp[k]+1);
}
}
for(int j=n;j>=i;j--)//也要以i点为结尾,因为序列中必须含有i点的值
{
for(int k=j;k<=n;k++)
{
if(t[k]<t[j])
{
dp1[j]=max(dp1[j],dp1[k]+1);
}
}
}
ans=max(ans,dp[i]+dp1[i]-1);
}
cout<<n-ans<<endl;
}

京公网安备 11010502036488号