解析题意:
md 有时候读题都读不懂 螬~
题目解析如下:
首先输入一排有n个同学。
然后这一排想让更多的同学留下来组成一个合唱队(人多力量大 更好理解)
最后剩下的同学就不得不出列,因为实在不能组成一个合唱队(输出最少最少出列的人数)
这里大家应该都看懂了题意了吧
下面我再说下如何解题:
首先从序号0~n-1进行遍历也就是for循环 (当i等于0-n-1中某个值的时候再开个for循环)
接着判断在序号i的时候,序号j(0-i),i同学左边有几个人身高小于他,如果此时j同学身高小于i同学,则i同学对应的身高left[i]=Math.max(left[i],left[j]+1);(这个我不仔细说了你应该能看出来)(就是当前j同学身高小于i同学吗嘛 可以把j同学拉进i的左子序列里面,此时比较这个i同学左子序列left[i]=left[j]+1把j同学的子序列拉进来大 还是 不拉j同学左子序列left[i]大)
从右边n-1遍历i的升序同样上面思路
下面代码:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n =Integer.parseInt(in.nextLine());
String b = in.nextLine();
String[] str=b.split(" {1,}");
int left[]=new int[n];
int right[]=new int[n];
for(int i=0;i<n;i++){
left[i]=1;//合唱队左子序列最少一个人
for(int j=0;j<i;j++){
if(Integer.parseInt(str[j])<Integer.parseInt(str[i])){
left[i]=Math.max(left[j]+1,left[i]);
}
}
}
for(int i=n-1;i>=0;i--){
right[i]=1;//合唱队右子序列最少一个人
for(int j=n-1;j>i;j--){
if((Integer.parseInt(str[j]) < Integer.parseInt(str[i]))){
right[i]=Math.max(right[j]+1,right[i]);
}
}
}
int l=1;//因为合唱队想要组成最少为一人
for(int i=0;i<n;i++){
l=Math.max(l,left[i]+right[i]-1);//选取i人左右边最长子序列,-1是因为这个i人在左右子序列里面被选了两次
}
System.out.println(n-l);//输出(总同学数-合唱队最大数量)
}