合唱队-动态规划-JAVA版
合唱队
http://www.nowcoder.com/questionTerminal/6d9d69e3898f45169a441632b325c7b4
题目描述
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<ti>Ti+1>......>TK。</ti>
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
注意不允许改变队列元素的先后顺序
请注意处理多组输入输出!
输入描述:
整数N
输出描述:
最少需要几位同学出列
示例1
输入
8
186 186 150 200 160 130 197 200
输出
4
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int[] arr1 = new int[n]; //存储每个数左边小于其的数的个数
int[] arr2 = new int[n];//存储每个数右边小于其的数的个数
arr1[0] = 1; //最左边的数设为1
arr2[n - 1] = 1; //最右边的数设为1
for (int i = 0; i < n; i++) {
arr1[i] = 1;
for (int j = 0; j < i; j++) {
if (arr[i] > arr[j]) { //动态规划
arr1[i] = Math.max(arr1[j] + 1, arr1[i]);
}
}
}
for (int i = n - 1; i >= 0; i--) {
arr2[i] = 1;
for (int j = n - 1; j > i; j--) {
if (arr[i] > arr[j]) { //动态规划
arr2[i] = Math.max(arr2[i], arr2[j] + 1);
}
}
}
int[] res = new int[n];
for (int i = 0; i < n; i++) {
res[i] = arr1[i] + arr2[i] - 1; //两个都包含本身
}
int max = 1;
for (int i = 0; i < n; i++) {
if (res[i] > max) {
max = res[i];
}
}
System.out.println(n - max);
}
}
}
帆软软件公司氛围 105人发布