题目可以转换成要求挑选从低到高再到低最长的一列人,面对这种问题我们可以求出每个数两边开始最大的递增数量,最后将两个数列相加减一求最大值,就是最长的队伍长度,出列的人只需总人数减去队伍长度便可。
#include<iostream> using namespace std; int arr[200], l[200], r[200]; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) //初始化,最少也有自己一个构成序列 { cin >> arr[i]; l[i] = 1; r[i] = 1; } for (int i = 2; i <= n; i++)//从左到右 { for (int j = 1; j < i; j++) { if (arr[i] > arr[j] && l[i] <= l[j]) //按要求更新表(后大于前由于初始化是一样的所以要<+) { l[i] = l[j] + 1; } } } for (int i = n - 1; i >= 1; i--)//从右往左 { for (int j = i + 1; j <= n; j++) { if (arr[i] > arr[j] && r[i] <= r[j]) { r[i] = r[j] + 1; } } } int total = 0; int max = 0; for (int i = 1; i <= n; i++) { total = l[i] + r[i] - 1; //从左往右,从右往左,自身被数了两次,所以要减一 if (total > max) { max = total; } } cout << n - max; return 0; }