rambless

合唱队

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

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            int num = in.nextInt();
            int[] arr = new int[num];
            for (int i = 0; i < num; i++) {
                arr[i] = in.nextInt();
            }

            //存放当前位置处左递减序列长度
            int[] dp1 = new int[num];
            //存放当前位置处右递增序列长度
            int[] dp2 = new int[num];
            Arrays.fill(dp1, 1);
            Arrays.fill(dp2, 1);

            //左序列初始化:当前索引i处存放0->i递增序列的最大长度:从左往右找
            for (int i = 0; i < num; i++) {
                for (int j = 0; j < i; j++) {
                    //如果j索引处比i索引处小
                    if (arr[i] > arr[j]) {
                        //动态转移方程
                        dp1[i] = Math.max(dp1[j] + 1, dp1[i]);
                    }
                }
            }

            //右序列初始化:当前索引i处存放i->num-1递增序列的最大长度:从右往左找
            for (int i = num - 1; i >= 0; i--) {
                for (int j = num - 1; j > i; j--) {
                    //如果j索引处比i索引处小
                    if (arr[i] > arr[j]) {
                        //动态转移方程
                        dp2[i] = Math.max(dp2[j] + 1, dp2[i]);
                    }
                }
            }

            //合并dp1,dp2
            int[] result = new int[num];
            for (int i = 0; i < num; i++) {
                result[i] = dp1[i] + dp2[i];
            }

            //长度减最大值再加一即为答案
            int max = 0;
            for (int i = 0; i < num; i++) {
                max = Math.max(max, result[i]);
            }

            System.out.println(num - max + 1);
        }
    }
}

全部评论

相关推荐

2025-12-03 03:32
安徽大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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