合唱队形
合唱队形
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; }