【LIS+LDS 对偶问题】 合唱队型

传送门

题意

给定一个长度为(N)的序列,去除最少的元素后序列先上升后下降,求最少去除元素的个数

数据范围

(1leq Nleq 1000)

题解

登山问题的对偶问题,只需要总长度减去得到的最长的值即可

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define ll long long
const int N=1010;
int n,f[N],F[N],a[N];
int main(){
    scanf("%d",&n);
    rep(i,1,n+1) scanf("%d",&a[i]);

    rep(i,1,n+1) {
        f[i]=1;
        rep(j,1,i)
            if(a[j]<a[i])
                f[i]=max(f[i],f[j]+1);
    }
    per(i,1,n+1){
        F[i]=1;
        per(j,i+1,n+1)
            if(a[j]<a[i])
                F[i]=max(F[i],F[j]+1);
    }
    int ans=-1;
    rep(i,1,n+1)
        ans=max(ans,f[i]+F[i]-1);
    ans=n-ans;
        printf("%d
",ans);
}
原文地址:https://www.cnblogs.com/hhyx/p/13389335.html