题目:
https://www.luogu.com.cn/problem/P1091
思路:
相当于要求最长先升后降的序列
拆开来看,先从左到右求一遍最长不下降子序列
再从右到左求一遍最长不下降子序列
再枚举求最大值
#include<stdio.h> #include<algorithm> using namespace std; int a[104]; int f[104],g[104]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); f[i]=1,g[i]=1; } for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) { if(a[j]<a[i]) f[i]=max(f[i],f[j]+1); } } for(int i=n;i>=1;i--) { for(int j=n;j>i;j--) { if(a[j]<a[i]) g[i]=max(g[i],g[j]+1); } } int t=0; for(int i=1;i<=n;i++) { if(f[i]+g[i]-1>t) t=f[i]+g[i]-1; } printf("%d\n",n-t); }