问题转化为:枚举中间点,以此为终点求最长的上升子序列,以此为起点求最长下降子序列。
#include#include using namespace std;int q[110],fq[110],fh[110],n,ans=500;int main(){ int maxn=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&q[i]); fq[i]=1,fh[i]=1; } for(int i=2;i<=n;i++)//最长上升子序列 { maxn=0; for(int j=1;j<=i-1;j++) { if(q[i]>q[j]&&fq[j]>maxn) maxn=fq[j]; } fq[i]+=maxn; } for(int i=n-1;i>=1;i--)//最长下降子序列 { maxn=0; for(int j=n;j>=i+1;j--) { if(q[j] maxn) maxn=fh[j]; } fh[i]+=maxn; } for(int i=1;i<=n;i++) { ans=min(ans,n-fq[i]-fh[i]+1); } printf("%d",ans); return 0;}