合唱队形

合唱队形

https://ac.nowcoder.com/acm/problem/16664

类似于最长上升子序列;
dp[i]=max(dp[i],dp[j]+1) (a[i]>a[j])

#include<bits/stdc++.h>
using namespace std;
int n,t[200],dp[200],dp1[200],ans;//dp是左半段,dp1是右半段
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>t[i],dp[i]=1,dp1[i]=1;
    for(int i=1;i<=n;i++)//枚举以i点的值为分界线
    {
        for(int j=1;j<=i;j++)//以i点为结尾,因为是以i作为前半段的结尾数
        {
            for(int k=1;k<=j;k++)
            if(t[j]>t[k]){
                dp[j]=max(dp[j],dp[k]+1);
            }
        }
        for(int j=n;j>=i;j--)//也要以i点为结尾,因为序列中必须含有i点的值
        {
            for(int k=j;k<=n;k++)
            {
                if(t[k]<t[j])
                {
                    dp1[j]=max(dp1[j],dp1[k]+1);
                }
            }
        }
        ans=max(ans,dp[i]+dp1[i]-1);
    }
    cout<<n-ans<<endl;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务