题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
//动态规划
//C++实现了一下最大递增和最大递减
//只要找到当前位置左侧的最大递增子串长度+右侧的最大递增子串长度的和最大
//也就是某个dp位置的递增dp+递减dp最大
//结果就是总数N-最大和+1(左右侧重复计算了)
#include<iostream>
#include<string>#include<vector>
#include<algorithm>
using namespace std;
int main(){
int N;
cin >> N;
vector<int> T;
for(int i = 0;i<N;++i){
int Ttemp;
cin >> Ttemp;
T.emplace_back(Ttemp);
}
//动态规划求最长递增子串
vector<int> dpincrease(N,1);
for(int i = 1;i<N;++i){
for(int j = i-1;j>=0;--j){
if(T[i] > T[j])dpincrease[i] = max(dpincrease[i],dpincrease[j]+1);
}
}
//动态规划求最长递减子串
vector<int> dpdecrease(N,1);
for(int i = N-1;i>=0;--i){
for(int j = i+1;j<N;++j){
if(T[i] > T[j])dpdecrease[i] = max(dpdecrease[i],dpdecrease[j]+1);
}
}
int res = 0;//最少踢出人数
for(int i = 0;i<N;++i){
if(dpincrease[i] != 1 && dpdecrease[i]!=1)res = max(res,dpincrease[i]+dpdecrease[i]);
}
cout << N-res+1 << endl;
return 0;
}