import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n=in.nextInt(); int res=n; //代表最少出列的同学数 /** 以a[i]为最高的同学,a[0,i]且以a[i]结尾的最长递增子序列长度l, a[i,n-1]且以a[i]开头的最长递减子序列长度r, 需要出列的n-l-r; */ in.nextLine(); int[] nums=new int[n];//存储n个数 int[] x=new int[n];//x[i]代表l int[] y=new int[n];//y[i]代表r for(int i=0;i<n;i++){ x[i]=1; y[i]=1; } for(int i=0;i<n;i++){ nums[i]=in.nextInt(); } for(int i=1;i<n;i++){//从第二个位置开始计算 for(int j=0;j<i;j++){ if(nums[i]>nums[j]){ x[i]=Math.max(x[i],x[j]+1); } } } for(int i=n-2;i>=0;i--){//从倒数第二个位置开始计算 for(int j=i;j<n;j++){ if(nums[i]>nums[j]){ y[i]=Math.max(y[i],y[j]+1); } } } for(int i=0;i<n;i++){ res=Math.min(res, n-(x[i]+y[i])+1); } System.out.println(res); } }
关键在于把问题拆分为两个子序列