合唱队列
洛谷1091 合唱队列
觉得自己就是个ZZ,打眼一看,没思路,一看数据,n<=100,这不会是大法师吧。。。于是打暴力,快一小时(加上30分钟下课~~哦,下课时和陈国凯聊了一会QQ,%%%学神,mac啊)也没调出来,信心倍挫,然后放弃,看题解,哦cao,是最长上升子序列,然后秒掉了。。。。。。。。。
先正着做一遍LIS,再倒着来一遍LIS,再枚举中间最高的人,正反求和,取最大,最后用n减去ans再减一,因为最高的人被算了两次。
#include<bits/stdc++.h> using namespace std; int n; int a[101]; int fr[101],ba[101]; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) for(int j=1;j<i;j++) { if(a[i]>a[j]) fr[i]=max(fr[i],fr[j]+1); } for(int i=n;i>=1;i--) for(int j=n;j>i;j--) { if(a[i]>a[j]) ba[i]=max(ba[i],ba[j]+1); } int ans=-1; for(int i=1;i<=n;i++) { ans=max(fr[i]+ba[i],ans); } cout<<n-ans-1; return 0; }