tj
2026-02-02 10:56:42
发布于:广东
2阅读
0回复
0点赞
求对于区间和区间的最长上升子序列和最长下降子序列(记得减去重叠的第位)之和则是合唱队组成的最大人数,最后使用总人数减此人数即可:
#include<iostream>
#include<vector>
#define ll long long
using namespace std;
int main() {
ll n;
cin>>n;
vector<ll> v(n,0),up(n,1),down(n,1);
for(ll i=0;i<n;i++) {
cin>>v[i];
}
// 最长上升子序列+最长下降子序列对于[0,k],[k,n-1]区间的分别取值
for(ll i=1;i<n;i++) {
for(ll j=0;j<i;j++) {
if(v[i]>v[j]) up[i]=max(up[i],up[j]+1);
}
}
for(ll i=n-2;i>=0;i--) {
for(ll j=n-1;j>i;j--) {
if(v[i]>v[j]) down[i]=max(down[i],down[j]+1);
}
}
ll sum=0;// 合唱队最大人数
for(ll k=0;k<n;k++) {
sum=max(sum,up[k]+down[k]-1);
}
cout<<n-sum;
}
这里空空如也







有帮助,赞一个