#include <stdio.h>
#include <string.h>
int array[60], array_r[60], lis[60], lis_r[60];
void LIS(int size, int *seq, int *max_arr)
{
int i, j;
for (i=1 ; i<=size ; i++) /* 注意,设置最长升序列数组的初始值为1 */
max_arr[i] = 1;
for (i=2 ; i<=size ; i++)
{
for (j=1 ; j<i ; j++)
{
/* 若可以加长,则改变之 */
if (seq[i] > seq[j] && max_arr[j] + 1 > max_arr[i])
max_arr[i] = max_arr[j] + 1;
}
}
}
int find_max(int size, int *arr, int *arr_r)
{
int i, max = 0;
for (i=1 ; i<=size ; i++)
{
if (arr[i] + arr_r[size - i + 1] > max)
{
max = arr[i] + arr_r[size - i + 1];
}
}
return max - 1;
}
int main(int argc, char *argv[])
{
int n, i, max;
while (EOF != scanf("%d", &n))
{
memset(lis, 0, sizeof(lis));
memset(lis_r, 0, sizeof(lis_r));
for (i=1 ; i<=n ; i++)
{
scanf("%d", &array[i]);
}
LIS(n, array, lis);
/* 翻转原sequence,再求一遍最长升序列 */
for (i=1 ; i<=n ; i++)
{
array_r[n - i + 1] = array[i];
}
LIS(n, array_r, lis_r);
/* 找到满足条件的最长序列 */
max = find_max(n, lis, lis_r);
printf("%d\n", n - max);
}
}
|