代码:
麻烦的思路(java):
import java.util.Scanner; //N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,而不改变其他同学的位置,使得剩下的K位同学排成合唱队形。 //合唱队形要求:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,则他们的身高满足T1<T2...<Ti>Ti+1>…>TK(1<=i<=K)。 //已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成最长的合唱队形。 public class tutti { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int height[] = new int[N]; int maxNumber[] = new int[N]; int max = -1; for (int i = 0; i < N; i++) { height[i] = sc.nextInt(); } for (int i = 0; i < N; i++) { int m = -1; left(i,height,maxNumber); for (int j = 0; j <= i; j++) { if(maxNumber[j]>m){ m = maxNumber[j]; } } int n = -1; right(i,height,maxNumber); for (int j = i; j < N; j++) { if(maxNumber[j]>n){ n = maxNumber[j]; } } if((m+n-1)>max){ max = m+n-1; } } System.out.println(max); } private static void right(int i, int[] height, int[] maxNumber) { for (int j = i; j < height.length; j++) { maxNumber[j] = 1; for (int j2 = i; j2 < j; j2++) { if((height[j]<=height[j2])&&(maxNumber[j2]+1>maxNumber[j])) maxNumber[j] = maxNumber[j2]+1; } } } private static void left(int i, int[] height, int[] maxNumber) { for (int j = 0; j <= i; j++) { maxNumber[j] = 1; for (int j2 = 0; j2 < j; j2++) { if((height[j]>=height[j2])&&(maxNumber[j2]+1>maxNumber[j])) maxNumber[j] = maxNumber[j2]+1; } } } }
简单的思路(java):
public class test { public static void main(String[] args) { int []high={176,163,150,140,180,130,167,160}; int []up=new int[8]; //记录每位同学的最大上升子序列 int []down=new int[8]; //记录每位同学的最大下降子序列 for(int i=0;i<high.length;i++){ up[i]=1; //每位同学的最大上升子序列初始值为1 for(int j=0;j<i;j++){ if((high[j]<high[i])&&(up[i]<up[j]+1)) up[i]=up[j]+1; //前i位同学的最大上升子序列的最大值再加1 } } for(int i=high.length-1;i>=0;i--){ down[i]=1; for(int j=high.length-1;j>i;j--){ if((high[j]<high[i])&&(down[i]<down[j]+1)) down[i]=down[j]+1; //后N-i位同学的最大下降子序列的最大值再加1 } } int max=0; //设每位同学所形成的最长合唱队形的最大值初值为0 int index=0; //设最大值对应的索引为0 for(int i=0;i<high.length;i++){ if(up[i]+down[i]-1>max) { max=up[i]+down[i]-1; //求得每位同学所形成的最长合唱队形的最大值 index=i; //求得对应的索引 } } System.out.println("最长合唱队形的长度为:"+max); System.out.println("对应的是第"+(index+1)+"位同学,需要"+(high.length-max)+"位同学出列"); } }