P1091 合唱队形(正反 lis)

传送门

题解:这个题先正向lcs,然后反向lcs,之后通过枚举中间点更新出答案即可。

附上代码:


#include<iostream>
#include<cstdio>

using namespace std;

int n,a[105],f[2][105],ans;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    a[0]=0;
    for(int i=1;i<=n;i++){
        for(int j=0;j<i;j++){
            if(a[i]>a[j]){
               f[0][i]=max(f[0][i],f[0][j]+1);
            }
        }
    }
    a[n+1]=0;
    for(int i=n;i>=1;i--){
        for(int j=n+1;j>i;j--){
            if(a[i]>a[j]){
                f[1][i]=max(f[1][i],f[1][j]+1);
            }
        }
    }
    for(int i=1;i<=n;i++){
        ans=max(f[0][i]+f[1][i]-1,ans);
    }
    printf("%d\n",n-ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/82749422
今日推荐