思路:
1、查找每一个数的左边的最大递增子字符串长度,放入数组incNum中。
2、查找每个数的右边最大递增子字符串长度,放入数组decNum中
3、两者相加,减去重复计算的1,即为将此数放中间组成合唱队所需要的人数,取最大值max
4、总人数减去第三步所得,就可以得出需要出列的最少人数
注意:身高是递增的,不能等于
这道题看很久了,一直不得其解,看了讨论里一楼的思路,和一楼下面的讨论和回复,才恍然大悟,总结成c语言如下
#include<stdio.h> int main(void){ int n; while(scanf("%d",&n)!=EOF){ int queue[n],incNum[n],decNum[n],max=0; for(int i = 0; i< n;i++){ scanf("%d",&queue[i]); incNum[i] = 1; decNum[i] = 1; //在这个循环里查出左边的递增字串数 if(i > 0){ for(int j = i-1;j>=0;j--){ if(queue[j] < queue[i] && incNum[i] < incNum[j] + 1) incNum[i] = incNum[j] + 1; } } } //计算右边的递增字串,并计算max for(int i = n-1;i>=0;i--){ if(i < n-1){ for(int j=i+1;j<n;j++){ if(queue[j] < queue[i] && decNum[i] < decNum[j] + 1) decNum[i] = decNum[j]+1; } } //计算最大的max max = decNum[i] + incNum[i] > max?decNum[i] + incNum[i]:max; } //需要出列的人数为,总人数减max,再减去重复多计算自己的一次 max = n-(max-1); printf("%d\n",max); } return 0; }