洛谷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 }