import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] t = new int[n]; for (int i = 0; i < n; i++) { t[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 (t[j] < t[i]) { left[i] = Math.max(left[i], left[j] + 1); } } } int[] dp = new int[n]; for (int j = n - 1; j >= 0; j--) { dp[j] = 1; for (int k = j + 1; k < n; k++) { if (t[k] < t[j]) { dp[j] = Math.max(dp[j], dp[k] + 1); } } } int[] right = new int[n]; for (int i = 0; i < n; i++) { int max = 0; for (int j = i + 1; j < n; j++) { if (t[j] < t[i] && dp[j] > max) { max = dp[j]; } } right[i] = max; } int max_val = 0; for (int i = 0; i < n; i++) { max_val = Math.max(max_val, left[i] + right[i]); } System.out.println(n - max_val); } }
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:读取同学总数和他们的身高数据。
- 计算 left 数组:left[i] 表示以第 i 个同学结尾的最长递增子序列的长度。
- 计算 dp 数组:dp[j] 表示从第 j 个同学开始的最长递减子序列的长度。
- 计算 right 数组:right[i] 表示第 i 个同学右边所有比它矮的同学的最长递减子序列的最大长度。
- 合并结果:遍历每个位置,计算 left[i] + right[i] 的最大值,从而得到最长合唱队形的长度,最终输出需要出列的同学数。