题解 | 合唱队
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
import java.util.Arrays; import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int num = in.nextInt(); int[] arr = new int[num]; for (int i = 0; i < arr.length; i++) { arr[i] = in.nextInt(); } int[] leftUp = new int[num]; int[] rightUp = new int[num]; for (int i = 0; i < num; i++) { leftUp[i] = 1; for (int j = 0; j < i; j++) { if (arr[i] > arr[j]) { leftUp[i] = Math.max(leftUp[i], leftUp[j] + 1); } } } for (int i = num - 1; i >= 0; i--) { rightUp[i] = 1; for (int j = num - 1; j > i; j--) { if (arr[i] > arr[j]) { rightUp[i] = Math.max(rightUp[i], rightUp[j] + 1); } } } int length = 0; for (int i = 0; i < num; i++) { length = Math.max(length, leftUp[i] + rightUp[i] - 1); } System.out.println(num - length); } }
#牛客春招刷题训练营# 这题我主要用到动态规划,也很容易理解,以合唱队的从小变大到从大变小的位置作为出发点,寻找最长递增序列和最长递减序列,两者相加减一,就是该位置形成合唱队队列的最长长度,然后暴力一下所有位置能够形成合唱队列的最长长度,然后用总长度减去该长度就是最终答案