codevs 1058 合唱队形

来源:互联网 发布:vb 播放器 编辑:程序博客网 时间:2024/05/16 14:55
题目描述 Description

    N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。

    合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,  则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。

    你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入描述 Input Description

    输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。

输出描述 Output Description

    输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

样例输入 Sample Input

8
186 186 150 200 160 130 197 220

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

对于50%的数据,保证有n<=20;
对于全部的数据,保证有n<=100。



思路:1、可以发现此题求最小用动规可解

           2、n表示为最高的那位,我们可以发现求出n左边的最长上升子序列fh[n],求出n右边的最长下降子序列fl[n];

   3、将他们相加再减去一(共用的n),就得多了最长的合唱队形

   4、再用n减去,发现最少出列人数得到。



<pre name="code" class="cpp">#include <cstdio>  #include <cstdlib>  #include <cstring>  #include <algorithm>  #include <cmath>  #include <iostream>  #include <iomanip>  using namespace std;  int main()  {    int a[101],n;    cin>>n;    int fh[101],fl[101];//fh[n]表示单调递增最大,fl[n]表示单调递减最小     for(int i=1;i<=n;i++)    {          cin>>a[i];          fh[i]=1;          fl[i]=1;      }        int maxhnum;    int maxlnum;      for(int i=1;i<=n;i++)      {          maxhnum=0;          for(int j=1;j<=i-1;j++)         {              if(a[i]>a[j])                  {                      if(maxhnum<fh[j])                      {                        maxhnum=fh[j];                                              }                  }          }        fh[i]+=maxhnum;          cout<<fh[i]<<' ';              }        cout<<endl;    for(int i=n;i>=1;i--)  //a[n] is increasing from i to n;we just need to find out The longest non descending sequence        {          maxlnum=0;                    for(int j=i+1;j<=n;j++)          {              if(a[i]>a[j])                  {                      if(maxlnum<fl[j])                      {                          maxlnum=fl[j];                      }                  }          }                 fl[i]+=maxlnum;         cout<<fl[i]<<' ';      }                  int maxl=0;      for(int i=1;i<=n;i++)      {          /*if(i==1||i==n)         continue;*/          maxl=max(fl[i]+fh[i]-1,maxl);      }            cout<<n-maxl;     return 0;  } 


0 0
原创粉丝点击