1. 程式人生 > >【p1091】洛谷p1091合唱隊形題解

【p1091】洛谷p1091合唱隊形題解

std ring CI 合唱隊 我們 amp ostream code n)

合唱隊形首先要滿足的是從1這個位置到中間任意的位置為單增的,從中間任意的位置到最後是單減的,且長度最長。這樣才能滿足出列的同學最少。

如果要滿足這個條件那麽我們可以先預處理出每個點的從前找的最長上升子序列的長度和從後找的最長上升子序列的長度。

再找一個最大值。

最後輸出總人數減去這個留下的最多人數再加1。

代碼:

#include<iostream>
#include<cstring>
using namespace std;
int a[20000],b[20000],c[20000],n,maxn;//c,b數組分別表示從後找,和從前找到數組下標的位置的最長上升子序列的長度。 
main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { b[i]=1; for(int j=1;j<=i-1;j++) { if((a[i]>a[j])&&(b[j]+1>b[i])) b[i]=b[j]+1; } } for(int i=n;i>=1
;i--) { c[i]=1; for(int j=i+1;j<=n;j++) if((a[j]<a[i])&&(c[j]+1>c[i]))//如果j這個位置的高度小於i這個位置 c[i]=c[j]+1; } maxn=0; for(int i=1;i<=n;i++) if(b[i]+c[i]>maxn) maxn=b[i]+c[i]; cout<<n-maxn+1<<endl; }

【p1091】洛谷p1091合唱隊形題解