import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] h = new int[n];
for (int i = 0; i < n; i++) {
h[i] = in.nextInt();
}
int[] left = new int[n];
for (int i = 0; i < n; i++) {
left[i] = 1;
for (int j = 0; j < i; j++) {
if (h[j] < h[i]) {
left[i] = Math.max(left[i], left[j] + 1);
}
}
}
int[] right = new int[n];
for (int i = n - 1; i >= 0; i--) {
right[i] = 1;
for (int j = i + 1; j < n; j++) {
if (h[j] < h[i]) {
right[i] = Math.max(right[i], right[j] + 1);
}
}
}
int maxLen = 0;
for (int i = 0; i < n; i++) {
if (left[i] >= 2 && right[i] >= 2) {
int current = left[i] + right[i] - 1;
if (current > maxLen) {
maxLen = current;
}
}
}
if (maxLen >= 3) {
System.out.println(n - maxLen);
} else {
System.out.println(n);
}
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:读取同学数量n和每位同学的身高数组h。
- 计算最长递增子序列:使用动态规划从左到右遍历,计算每个位置左边的最长严格递增子序列长度,存储在left数组中。
- 计算最长递减子序列:使用动态规划从右到左遍历,计算每个位置右边的最长严格递减子序列长度,存储在right数组中。
- 寻找最大合唱队形长度:遍历每个位置,若其左右两边均存在至少一个同学,则计算当前可能的合唱队形长度,并更新最大值。
- 输出结果:若存在有效的合唱队形,输出需要出列的最少人数;否则输出总人数,表示无法形成有效队形,所有同学均需出列。



京公网安备 11010502036488号