题解 | 合唱队

合唱队

https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4

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);

    }
}

关键在于把问题拆分为两个子序列

全部评论

相关推荐

06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
06-23 11:43
门头沟学院 Java
allin校招的烤冷...:我靠,今天中午我也是这个hr隔一个星期发消息给我。问的问题还是一模一样的😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务