1264:【例9.8】合唱隊形
阿新 • • 發佈:2019-01-13
【題目描述】
NN位同學站成一排,音樂老師要請其中的(N−K)(N−K)位同學出列,使得剩下的KK位同學排成合唱隊形。
合唱隊形是指這樣的一種隊形:設KK位同學從左到右依次編號為1,2,…,K1,2,…,K,他們的身高分別為T1,T2,…,TKT1,T2,…,TK,則他們的身高滿足T1<T2<…<Ti,Ti>Ti+1>…>TK(1≤i≤K)T1<T2<…<Ti,Ti>Ti+1>…>TK(1≤i≤K)。
你的任務是,已知所有NN位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
【輸入】
輸入的第一行是一個整數N(2≤N≤100)N(2≤N≤100),表示同學的總數。第二行有nn個整數,用空格分隔,第ii個整數Ti(130≤Ti≤230)Ti(130≤Ti≤230)是第ii位同學的身高(釐米)。
【輸出】
輸出包括一行,這一行只包含一個整數,就是最少需要幾位同學出列。
【輸入樣例】
8 186 186 150 200 160 130 197 220
【輸出樣例】
4
【提示】
對於50%的資料,保證有n≤20n≤20;
對於全部的資料,保證有n≤100n≤100。
【來源】
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 1005 int f1[maxn]; int f2[maxn]; int a[maxn]; int main() { int n; cin>>n; memset(f1,0,sizeof(f1)); memset(f2,0,sizeof(f2)); for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) f1[i]=f2[i]=1; for(int i=2;i<=n;i++) for(int j=1;j<i;j++) if(a[j]<a[i]&&f1[i]<f1[j]+1) f1[i]=f1[j]+1; for(int i=n-1;i>=1;i--) for(int j=i+1;j<=n;j++) if(a[j]<a[i]&&f2[i]<f2[j]+1) f2[i]=f2[j]+1; int maxx=-1000000; for(int i=1;i<=n;i++) maxx=max(maxx,f1[i]+f2[i]); cout<<n-(maxx-1)<<endl; return 0; }