描述
计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
N 位同学站成一排,音乐老师要请其中的 (N - K) 位同学出列,使得剩下的 K 位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为 1,2…,K ,他们的身高分别为 T1,T2,…,TK , 则他们的身高满足存在 i (1<=i<=K) 使得 T1<T2<......<Ti-1<Ti>Ti+1>......>TK 。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
注意:不允许改变队列元素的先后顺序 且 不要求最高同学左右人数必须相等
数据范围: 1 \\le n \\le 3000 \\1≤n≤3000
输入描述:
用例两行数据,第一行是同学的总数 N ,第二行是 N 位同学的身高,以空格隔开
输出描述:
最少需要几位同学出列
示例1
输入:
8 186 186 150 200 160 130 197 200
输出:
4
说明:
由于不允许改变队列元素的先后顺序,所以最终剩下的队列应该为186 200 160 130或150 200 160 130
1 import java.io.*; 2 import java.util.*; 3 4 public class Main { 5 public static void main(String[] args) throws IOException { 6 Scanner sc = new Scanner(System.in); 7 while(sc.hasNext()) { 8 int ren = sc.nextInt(); 9 int[] shengao = new int[ren]; 10 for(int i =0; i<ren; i++) { 11 shengao[i] = sc.nextInt(); 12 } 13 14 int[] left = new int[ren]; 15 int[] righ = new int[ren]; 16 int[] result = new int[ren]; 17 18 //左侧递增 19 for(int i=0; i<ren; i++) { 20 left[i] =1; 21 for(int j =0; j<ren; j++) { 22 if(shengao[i] > shengao[j]) { 23 left[i] = Math.max(left[i], left[j] + 1); 24 } 25 } 26 } 27 28 //右侧递减 29 for(int i = ren -1; i>=0; i--) { 30 righ[i] =1; 31 for(int j =ren-1; j>=0; j--) { 32 if(shengao[i] > shengao[j]) { 33 righ[i] = Math.max(righ[i], righ[j] +1); 34 } 35 } 36 } 37 38 for(int i =0; i<ren; i++) { 39 result[i] = left[i] + righ[i] -1; 40 } 41 42 int max =1; 43 for(int i=0; i< ren; i++) { 44 max = Math.max(result[i], max); 45 } 46 47 System.out.println(ren - max); 48 } 49 } 50 }
来源:https://www.cnblogs.com/m6233/p/15978630.html
本站部分图文来源于网络,如有侵权请联系删除。