題意:從一列隊伍中抽出一些人,使得剩下的隊伍中的人按身高有序排列(升序,或者降序,或者先升後降).
題解:LIS。枚舉邊界。邊界左邊的人身高逐漸升高,右邊的逐漸降低。
#include <cstdio>#define N 1010double array[N];int dpleft[N], dpright[N];int max ( int a, int b ){return a > b ? a : b;}int min ( int a, int b ){return a < b ? a : b;}int main(){int n, i, j, temp;scanf("%d",&n);for ( i = 1; i <= n; i++ )scanf("%lf",&array[i]);dpleft[0] = 0;for ( i = 1; i <= n; i++ ){for ( j = 0; j < i; j++ )if ( array[i] > array[j] )dpleft[i] = max ( dpleft[j] + 1, dpleft[i] );}for ( i = 1; i <= n; i++ )dpleft[i] = max ( dpleft[i], dpleft[i-1] ); dpright[n+1] = 0;for ( i = n; i >= 1; i-- ){for ( j = n+1; j > i; j-- ) if ( array[i] > array[j] ) dpright[i] = max ( dpright[j] + 1, dpright[i] );}for ( i = n; i >= 1; i-- )dpright[i] = max ( dpright[i], dpright[i+1] );temp = 0; for ( i = 1; i <= n; i++ )temp = max ( dpleft[i] + dpright[i+1], temp );printf("%d\n", n - temp );return 0;}