合唱队形

合唱队形

(chorus.pas/c/cpp)

来源:NOIP2004(提高组) 第一题

     N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
    合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,  则他们的身高满足T1<...Ti+1>…>TK(1<=i<=K)。
    你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入文件】
    输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
【输出文件】
    输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【样例输入】
8
186 186 150 200 160 130 197 220
【样例输出】
4
【数据规模】
对于50%的数据,保证有n<=20;
对于全部的数据,保证有n<=100。

==================================

其实是最长不下降序列和上升序列

=================================

{
ID:jie19952
PROG:
LANG:PASCAL
}
var
  n:longint;
  a:array[1..100]of longint;
  f_up,f_down:array[0..101]of longint;
procedure init;
begin
  assign(input,'chorus.in');
  assign(output,'chorus.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

procedure main;
var
  i,j:longint;
  ans:longint;
begin
  readln(n);
  for i:=1 to n do
    begin
      read(a[i]);
      f_up[i]:=1;
      f_down[i]:=1;
    end;
  f_up[0]:=0; f_up[n+1]:=0;
  f_down[0]:=0; f_down[n+1]:=0;
  
  for i:=1 to n do
    begin
      for j:=i-1 downto 1 do
        if (a[i]>a[j]) and (f_up[i]a[j]) and (f_down[i]


 

你可能感兴趣的:(NOIP2011黎明前夕的黑暗,NOIP原题,动态规划)