题目链接:

思路:
题目意思,找出最少的同学出列,保证学生 1-t 上升, t-n 下降。我们只要求出每个点的最长上升子序列和最长不上升子序列,然后总人数-最长上升子序列和最长不上升子序列+1,就是最少同学出列。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 110;
int n, arr[N];
int dp[N], g[N];
signed main(){
cin >> n;
for(int i =1; i <= n; i++) cin >> arr[i];
//上升
for(int i = 1; i <= n; i++){
dp[i] = 1;
for(int j = 1; j< i; j++){
if(arr[j] < arr[i]){
dp[i] = max(dp[i], dp[j]+1);
}
}
}
//下降
for(int i = n; i >=1; i--){
g[i] = 1;
for(int j =n; j > i; j--){
if(arr[j] < arr[i]){
g[i] = max(g[i], g[j]+1);
}
}
}
//找到最长上升子序列和最长不上升子序列数量
int ans = 0;
for(int i =1; i <= n; i++){
ans = max(ans, g[i]+dp[i]);
}
cout << n - ans +1<< endl;
return 0;
}