动态规划、最长上升子序列类问题

合唱队形为一个上升子序列后接一个下降子序列,计算以 $i$ 结尾的最长上升子序列和以 $i$ 开头的最长下降子序列长度,分别记为 $lis_i$ 和 $lds_i$,答案为 $ n -\max \limits_{i=1}^{n} (lis_i+lds_i-1)$。

时间复杂度 $O(n^2)$。

#include<bits/stdc++.h>
using namespace std;
int n,ans,a[101],up[102],down[102];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        up[i]=down[i]=1;
    }
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            if(a[i]<a[j]) up[j]=max(up[j],up[i]+1);
    for(int i=n;i>=1;i--)
        for(int j=i-1;j>=1;j--)
            if(a[i]<a[j]) down[j]=max(down[j],down[i]+1);
    for(int i=1;i<=n;i++)
        ans=max(ans,up[i]+down[i]-1);
    printf("%d\n",n-ans);
    return 0;
}
最后修改:2024 年 05 月 28 日
如果觉得我的文章对你有用,请随意赞赏