Description
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
Input
输入的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
Output
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
Sample Input
8
186 186 150 200 160 130 197 220
Sample Output
4
这是一道线性动态规划的题目,这道题目其实我们可以遵循上面那道题的思想。对于每一个点,求出左边最长递增序列,右边的最长递减序列,然后相加就可以得到队形的最大长度,用总人数减去这个队形的长度就可以得到最少出队的人数。
int SequenceL(int *array, int n){
int *temp1=new int[n];
int *temp2=new int[n];
memset(temp1,0,sizeof(int)*n);
memset(temp2,0,sizeof(int)*n);
temp1[0]=1;
int max=1;
for(int i=1 ; i<n ; i++){
max=1;
for(int j=i-1 ; j>=0 ; j--){
if(array[j]<array[i] && temp1[j]+1>max)
max=temp1[j]+1;
}
temp1[i]=max;
}
for(int i=n-1 ; i>=0 ; i--){
max=1;
for(int j=i+1 ; j<n ; j++){
if(array[j]<array[i] && temp2[j]+1>max)
max=temp2[j]+1;
}
temp2[i]=max;
}
max=0;
for(int i=0 ; i<n ; i++){
if(temp1[i]+temp2[i]-1>max)
max=temp1[i]+temp2[i]-1;
}
delete temp1,temp2;
return n-max;
}