洛谷P1091 合唱队形

题解:要让出去的人最少,我们很容易会想到让留下的人更多。

要让队列单调的不等关系,我们很容易就想到了最长上升子序列。

问题是找到转折点,所以我们就做一遍最长上升子序列,再做一遍最长下降子序列,然后枚举每个点当转折点

的答案大小即为留在队伍里最多的人,用总人数减去即为答案。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 int n,dp_up[205],dp_down[205],a[205];
 9 
10 int main()
11 {
12     scanf("%d",&n);
13     for(int i=1;i<=n;i++)
14         scanf("%d",&a[i]);
15     for(int i=1;i<=n;i++)
16     {
17         dp_up[i]=1;
18         for(int j=1;j<i;j++)
19             if(a[i]>a[j]&&dp_up[j]+1>dp_up[i]) dp_up[i]=dp_up[j]+1;
20     }
21     for(int i=n;i>=1;i--)
22     {
23         dp_down[i]=1;
24         for(int j=n;j>i;j--)
25             if(a[i]>a[j]&&dp_down[j]+1>dp_down[i]) dp_down[i]=dp_down[j]+1;
26     }
27     int ans=0;
28     for(int i=1;i<=n;i++)
29         ans=max(ans,dp_up[i]+dp_down[i]-1);
30     printf("%d",n-ans);
31     return 0;
32 }
View Code
原文地址:https://www.cnblogs.com/Hoyoak/p/11393287.html