1. 程式人生 > >1264:【例9.8】合唱隊形

1264:【例9.8】合唱隊形

【題目描述】

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。

【來源】


No

#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;


}