洛谷 P1091 合唱队形 DP

传送门:

在这里插入图片描述
题解:

可以看出题目让我们构造出倒 V 型数列,最少出队几个人 :
在这里插入图片描述
对于上图的数列来说就是先增后减。要构造出以上数列,我们用 dp 求每个位置的单调递增个数和单调递减个数,这样也就是该位置的倒V数列的在队人数,我们只需要枚举每个位置,求出哪一个位置的人数最多即可,最后用总人数-max,得到答案

AC代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;;
int a[maxn];
int dp1[maxn],dp2[maxn];
int main()
{
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
    }
    for(int i=1; i<=n; i++)
    {
        dp1[i]=1;
        for(int j=1; j<i; j++)
        {
            if(a[j]<a[i])
            {
                dp1[i]=max(dp1[i],dp1[j]+1);
            }
        }
    }
    for(int i=n; i>=1; i--)
    {
        dp2[i]=1;
        for(int j=i+1; j<=n; j++)
        {
            if(a[i]>a[j])
            {
                dp2[i]=max(dp2[i],dp2[j]+1);
            }
        }
    }
    int res=0;
    for(int i=1; i<=n; i++)
    {
        res=max(res,dp1[i]+dp2[i]-1);
    }
    cout<<n-res<<endl;
}
发布了222 篇原创文章 · 获赞 16 · 访问量 9735

猜你喜欢

转载自blog.csdn.net/yangzijiangac/article/details/104255503