这是我的AC代码,就是从中间人分成两组,一个向左,一个向右,以中间人开始,求解最长下降序列
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,a[102],b1[102],b2[102],c1,c2,bm=2;
int main(){
// freopen("chorus.in","r",stdin);
// freopen("chorus.out","w",stdout);
cin>>n;
for (int i = 1; i <= n; i++) cin>>a[i];
for (int i = 1; i <= n; i++){
int mid=i;
memset(b1,0,sizeof(b1));
memset(b2,0,sizeof(b2));
c1=0;
c2=0;
b1[0]=114514;
b2[0]=114514;
for(int j=mid;j>=1;j--){
// cout<<"az"<<a[j]<<endl;
if(a[j]<b1[c1]){
b1[++c1]=a[j];
}
else if(a[j]!=b1[c1]){
// bool ha=0;
for(int k=1;k<=c1;k++)
if(a[j]>=b1[k]){
b1[k]=a[j];
break;
// ha=1;
}
// if(ha==0) b1[0]=a[j];
}
}
for(int j=mid;j<=n;j++){
// cout<<"pay"<<a[j]<<' '<<b2[c2]<<endl;
if(a[j]<b2[c2]) b2[++c2]=a[j];//cout<<"once"<<b2[c2]<<"aaa"<<c2<<endl;
else if(a[j]!=b2[c2]){
// bool ha=0;
//cout<<"woc"<<a[j]<<' '<<b2[c2]<<endl;
for(int k=1;k<=c2;k++)
if(a[j]>=b2[k] ){
b2[k]=a[j];
break;
// ha=1;
}
/// if(ha==0) b2[0]=a[j];
}
// for(int i=1;i<=c2;i++)
// cout<<b2[i]<<' ';
// cout<<" "<<c2;
// cout<<endl;
}
// cout<<endl;
// cout<<endl;
// cout<<i<<endl;
/*for(int k=1;k<=c1;k++)
cout<<b1[k]<<' ';
cout<<endl;
for(int k=1;k<=c2;k++)
cout<<b2[k]<<' ';
cout<<endl; */
bm=max(bm,c1+c2-1);
// cout<<c1<<' '<<c2<<endl;
// cout<<endl;
// cout<<endl;
}
cout<<n-bm<<endl;
return 0;
}
13 176 164 166 189 178 230 150 134 135 222 162 230 229 176 1 176 164 2 176 166 2 189 166 2 189 178 2 230 178 2 230 178 150 3 230 178 150 134 4 230 178 150 135 4 230 222 150 135 4 230 222 162 135 4 230 222 162 135 4 230 229 162 135 4 9
这是当以第一个人为中间人时的序列变化,我认为应该在if(a[j]>=b2[k] )和if(a[j]>=b1[k])的判断条件里加上and k!=1,因为作为中间人是一定要有的,但只有70分,去掉后就AC了,虽然按照程序输出的模拟并不符合题意,因为序列第一个数已经比中间人大了,所以正确性证明该如何证明呢