HJ24 合唱队
双向LIS,枚举每一个点的答案,选择出最优答案(答案要求删去的人最少,反过来就是合唱队的人数最多,由于LIS包含自身,所以双向LIS加起来后要多扣掉一个重复的自己)
简易版的LIS就是从前往后确定一个点,并在这个点之前挑选出一个能继续构成序列的点(a[j]<a[i]),使得总序列的长度更长。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 3E3+50;
int n,a[N];
int lLis[N],rLis[N];
int main() {
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i],lLis[i] = rLis[i] = 1;
for(int i=2;i<=n;i++){
for(int j=1;j<=i-1;j++){
if(a[j]<a[i])lLis[i] = max(lLis[i],lLis[j]+1);
}
}
for(int i=n-1;i>=1;i--){
for(int j=i+1;j<=n;j++){
if(a[j]<a[i])rLis[i] = max(rLis[i],rLis[j]+1);
}
}
int Longest = 1;
for(int i=1;i<=n;i++)
{
Longest = max(Longest,lLis[i]+rLis[i]-1);
}
cout<<n-Longest;
return 0;
}
更多算法知识,可点击晓源算法专栏